Die gesamte Architektur einer XenDesktop 7.x Umgebung baut auf die Nutzung interner Zertifikate auf. Für die interne Nutzung, zum Beispiel für Verbindungen des StoreFront Servers mit dem Desktop Devlivery Controller möchte man Zertifikate nutzen, die nicht jedes Jahr ausgetauscht werden müssen. Ein Jahr ist die Standardeinstellung der Microsoft CA für Webserver Zertifikate. Zusätzlich soll gezeigt werden, dass auch eine Microsoft CA mit Powershell installiert werden kann. Die Microsoft CA, kann über die Windows Rollen einem jeden Windows Serversystem hinzugefügt werden. Mit der CA können sehr leicht Zertifikate erstellt werden, die zum Beispiel für eine Serverauthentifizierung gültig sind. Neuen Anforderungen entsprechend werden heute in Terminalserverumgebungen fast alle Datenwege verschlüsselt. Also auch die Kommunikation mit der Citrix STA sollte verschlüsselt erfolgen. Nun bietet die Microsoft CA im Standard nur Zertifikate für zwei Jahre an. Es ist jedoch möglich, ein eigenes Template zu erstellen, um langjährige Zertifikate zu generieren. Hier eine Beschreibung, wie das zu erreichen ist. Zuerst die Installation der Microsoft CA mit Powershell. Einige Einstellungen sollten unbedingt genau kontrolliert werden. Diese Konfiguration ist für die Erstellung eines schnellen Zertifikates gut. Das kann auch in einer Testumgebung erfolgen und anschließend werden die Zertifikate für die Produktionsumgebung nur auf den Servern importiert, wo diese benötigt werden. Jedoch sollte so keinesfalls für die Gesamtstruktur eines Unternehmens installiert werden. Eine CA, für E-Mail Verschlüsslung ist sorgfältig zu planen. Das Root Zertifikate der Installation wird automatisch im Active Directory repliziert. Ist also nach einiger Zeit auf allen Domänenmitgliedern verfügbar (Server/Clients). Es ist daher zu empfehlen, die „ValidityPeriod“ der Root kürzer zu halten, falls es einmal zu kritischen Sicherheitsproblemen kommt.
add-WindowsFeature Web-Server -IncludeManagementTools add-WindowsFeature AD-Certificate add-windowsFeature RSAT-ADCS Install-AdcsCertificationAuthority -CAType EnterpriseRootCA -HashAlgorithmName SHA256 ` -ValidityPeriod Years -ValidityPeriodUnits 10 -KeyLength 2048 ` -CACommonName UranRootCA ` -DatabaseDirectory c:\CertDB -LogDirectory c:\CertLog -Confirm:$false
Als Resultat liefert die Powershell die folgende Ausgabe, wenn die CA erfolgreich installiert wurde:
Certification authority will be installed with the following properties:
CAType: EnterpriseRootCA CACommonName UranRootCA CADistinguishedNameSuffix DC=uran,DC=local CADistinguishedName: CN=UranRootCA,DC=uran,DC=local IgnoreUnicode: False OverwriteExistingKey: False OverwriteExistingCAinDS: False ValidityPeriod: Years ValidityPeriodUnits: 10 CryptoProviderName: RSA#Microsoft Software Key Storage Provider HashAlgorithmName: SHA256 KeyLength: 2048 KeyContainerName: AllowAdministratorInteraction: False CertFile: CertificateID: OutputCertRequestFile: DatabaseDirectory: c:\CertDB LogDirectory: c:\CertLog OverwriteExistingDatabase: False ParentCA:
Installation des Web-Managements
Das Web Management ermöglicht es, die Zertifikate bequem über eine Webseite im Browser zu generieren. Im Folgenden die notwendigen Powershell Anweisungen
Add-WindowsFeature ADCS-Enroll-Web-Svc Install-AdcsEnrollmentWebService Add-WindowsFeature ADCS-Web-Enrollment Install-AdcsWebEnrollment Add-WindowsFeature ADCS-Enroll-Web-Svc Success Restart Needed Exit Code Feature Result ------- -------------- --------- -------------- True No Success {Certificate Enrollment Web Service} Install-AdcsEnrollmentWebService Enrollment Service will be installed with the following properties: CAConfig: SURANDC.uran.local\UranRoot-CA AuthenticationType: Kerberos ApplicationPoolIdentity: True ServiceAccountName: RenewalOnly: False AllowKeyBasedRenewal: False SSLCertThumbprint: URL: https://surandc.uran.local/UranRoot- CA_CES_Kerberos/service.svc/CES Add-WindowsFeature ADCS-Web-Enrollment Install-AdcsWebEnrollment The Certification Authority Web Enrollment role will be installed with the following properties: CAConfig: SURANDC.uran.local\UranRoot-CA
Die CA ist nun auf dem Server selber unter http://localhost/certsrv/ zu erreichen
Erstellen eines neuen Templates für Zertifikate
Die MMC starten (mmc.exe) und über „File, Add/Remove Snap-in“ (bzw. Deutsch: Snap-In hinzufügen) das Snap-In „Certificate Templates“ hinzufügen. Dieses Template bildet die Grundlage für die Zertifikate, die mit der Microsoft CA erstellt werden. Das Template „Web Server“ duplizieren (rechte Maustaste) und beispielsweise nach „WebServer 10Jahre“ umbenennen. Beispielsweise, wenn ein Zertifikat erstellt werden soll, dass 10 Jahre funktioniert. In den Einstellungen „General“ wird festgelegt, wie lange das Zertifikat gültig ist. Mit der "Renewal peropd“ wiederum wird festgelegt, wann das Zertifikat versucht, sich bei der CA zu erneuern. Eine zu kleine „Renewal period“ führt dazu, dass die Kommunikationsanfragen zu der CA steigen. In diesem Fall wollen wir das Zertifikat aber von einer externen CA (in der Testumgebung) exportieren. Daher ist diese Periode auch möglich groß gewählt. Eine Terminalserverfarm, die intern mit diesen Zertifikaten abgesichert wird, muss spätestens nach 5 Jahren erneuert werden, bzw. neue Zertifikate bekommen.
Das Template kann über die Funktion „Change Name“ umbenannt werden. In diesem Beispiel in „Web Server-6y“ Mit einer Zertifikatanforderung an eine CA wird gleichzeitig der private Schlüssel eines Zertifikates generiert. Dieser ist gebunden an das anfordernde System und kann im Normalfall, aus Sicherheitsgründen nicht exportiert werden. Für Zertifikate in einer anderen Umgebung, zum Beispiel zur Absicherung der Kommunikation innerhlab einer Serverfarm, ist der private Schlüssel erforderlich, Daher muss im Template die Möglichkeit für einen Export konfiguriert sein. Das ist in den Einstellungen unter „Request Handling“ und „Allow private key to be exported“ möglich.
Hinzufügen des neuen Templates zu den nutzbaren Vorlagen
Das neue Template ist nicht sofort verfügbar, sondern muss in der „Certificate Authority“ MMC zunächst erlaubt werden. Dazu eine MMC starten und das Sanp-In „Certification Authority“ einfügen. Unter „Certificate Templates“ nun über die Funktion „New, Certificate Template to Issue“ das neu erstellte Template einfügen. GANZ WICHTIG: An der CA sind abschließend noch einige Anpassungen nötig, damit diese für 20 Jahre ausstellen kann. Erst mit den folgenden Befehlen wird die CA dafür autorisiert.
certutil -setreg ca\validityperiodunits 20 net stop certsvc net start certsvc
PowerShell Skript zum Import von zertifikaten
Nun ist es sicher auch schön, wenn diese Zertifikate mit PowerShell automatisiert importiert werden können. Wir benutzte die Automatisierungslösung „Uranos“ (https://sourceforge.net/projects/uranos/) zur automatischen Installation von Xen app 4.5 bis XenDesktop 7.x Umgebungen bei unseren Kunden seit nun rund 10 Jahren. Für diese Lösung haben wir zum Import von zertifikaten das folgende Skript erstellt. Dieses Skript bindet auch automatisch das Serverzertifikat in den IIS ein. Wir benutzen hier ein universelles Zertifikat (*.DOMAIN.LOCAL)
########################################################### # # Project : "Uran" Unattended Remote Automation # Author : Andreas Nick 2015 # Function : Impert CERTIFICATES "CER" from the Store_Trust folder # # www.software-virtualisierung.de # www.nick-it.de # ########################################################### $TrustFolder = "Z:\packages\Configurations\Certificates\Store_Trust" $ComputerFolder = "Z:\packages\Configurations\Certificates\Store_Personal" Function Import-Certificate { [cmdletbinding( SupportsShouldProcess = $True )] Param ( [parameter(ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True)] [Alias('PSComputername', '__Server', 'IPAddress')] [string[]]$Computername = $env:COMPUTERNAME, [parameter(Mandatory = $True)] [string]$Certificate, [System.Security.Cryptography.X509Certificates.StoreName]$StoreName = 'My', [System.Security.Cryptography.X509Certificates.StoreLocation]$StoreLocation = 'LocalMachine' ) Begin { $CertificateObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $CertificateObject.Import($Certificate) } Process { ForEach ($Computer in $Computername) { Try { Write-Verbose ("Connecting to {0}\{1}" -f "\\$($Computername)\$($StoreName)", $StoreLocation) $CertStore = New-Object System.Security.Cryptography.X509Certificates.X509Store -ArgumentList "\\$($Computername)\$($StoreName)", $StoreLocation $CertStore.Open('ReadWrite') If ($PSCmdlet.ShouldProcess("$($StoreName)\$($StoreLocation)", "Add $Certificate")) { $CertStore.Add($CertificateObject) } } Catch { Write-Warning "$($Computer): $_" } } } } Write-Host "import Store $TrustFolder\" foreach($Cert in (Get-ChildItem "$TrustFolder\*.cer" )){ Write-Host "import $Cert" Import-Certificate -Certificate $Cert.FullName -StoreName Root -StoreLocation LocalMachine -Verbose } Write-Host "import Personal Wildcard" certutil -f -importpfx -p "Uranos1234" "$ComputerFolder\UranLocal_Wildcard10y.pfx" #Bind IIS $cert = dir Cert:\LocalMachine\My | Where-Object { $_.subject -match 'CN=\*.uran.local' } $strThumb = $cert.Thumbprint.ToString() Write-Host "Trumbprint :" $strThumb Write-Host "Bind on IIS, if installed" $IIS = Get-service | Where-Object {$_.name -eq "W3SVC"} if ($IIS) { Import-Module WebAdministration Push-Location IIS:\ cd SslBindings New-webBinding -Name "Default Web Site" -IP "*" -Port 443 -Protocol https -HostHeader $("$ENV:COMPUTERNAME"+'.uran.local').toLower() get-item cert:\LocalMachine\MY\$strThumb | new-item 0.0.0.0!443 Pop-Location Write-Host "Restart W3SVC" restart-Service W3SVC }