By Andreas Nick on Mittwoch, 27. April 2016
Category: Powershell

Erstellung langjähriger Zertifikate zur Nutzung mit Citrix

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
}

Related Posts

Leave Comments