Wie kann ich mit PowerShell ein domänensigniertes Zertifikat in IIS erstellen und installieren?

Wie kann ich mit PowerShell ein domänensigniertes Zertifikat in IIS erstellen und installieren?

In meiner Umgebung hosten wir eine ganze Reihe von Websites und WCF-Webdiensten in IIS (unter Windows 2008 R2 und Windows 2012).

Wir sind dabei, HTTPS auf diesen Seiten zu aktivieren. Dies geschieht wie folgt:

  • Erstellen Sie in IIS ein domänensigniertes *.environment.domainZertifikat und verwenden Sie dazu die in unserem Netzwerk verfügbare Active Directory-Zertifizierungsstelle.
  • Aktivieren Sie HTTPS auf den Sites, indem Sie die Site-Bindungen ändern und das generierte Zertifikat anwenden.

Angesichts der Anzahl der Maschinen und Sites möchten wir die erforderlichen Aktionen automatisieren. Ich kann während der Bereitstellung die richtigen Site-Bindungen auf die Sites anwenden, habe jedoch noch keine Lösung zum Erstellen und Installieren eines domänensignierten Zertifikats in IIS gefunden.

Ich habe bereits herausgefunden, wie das manuell geht, indem ich das Symbol „Serverzertifikate“ in IIS verwende und dort die Aktion „Domänenzertifikat erstellen“ aufrufe. Ich kann die richtigen Anmeldeinformationen angeben und wenn ich die Zertifizierungsstelle angebe, kann ich die gewünschten Zertifikate erstellen.

Ich habe auch festgestellt, dass Sie mithilfe des PowerShell-Laufwerks anzeigen können, welche Zertifikate auf dem Computer installiert sind cert:\:

cert:\LocalMachine\My> Get-ChildItem

Und ich habe festgestellt, dass unter Windows Server 2012 ein PowerShell-CmdLet verfügbar ist New-SelfSignedCertificate.

Ich kann jedoch nicht die erforderlichen PowerShell-Befehle finden, um alle diese Aktionen auf Windows Server 2008 R2 zu kombinieren.

Wie erstelle und installiere ich mit PowerShell ein domänensigniertes SSL-Zertifikat in IIS?

Antwort1

Versuche Folgendes:

function New-DomainSignedCertificate {
    [CmdletBinding()]
    param(
        [parameter(Mandatory=$true)]
        [string]
        $Hostname,

        [parameter(Mandatory=$true)]
        [string]
        $Organization,

        [parameter(Mandatory=$true)]
        [string]
        $OrganizationalUnit,

        [parameter(Mandatory=$true)]
        [string]
        $Locality,

        [parameter(Mandatory=$true)]
        [string]
        $State,

        [parameter(Mandatory=$true)]
        [string]
        $Country,

        [parameter(Mandatory=$true)]
        [string]
        $CertificateAuthority,

        [parameter(Mandatory=$false)]
        [string]
        $Keylength = "2048",

        [string]
        $workdir = $env:Temp
    )

    $fileBaseName = $Hostname -replace "\.", "_" 
    $fileBaseName = $fileBaseName -replace "\*", ""

    $infFile = $workdir + "\" + $fileBaseName + ".inf"
    $requestFile = $workdir + "\" + $fileBaseName + ".req"
    $CertFileOut = $workdir + "\" + $fileBaseName + ".cer"

    Try {
        Write-Verbose "Creating the certificate request information file ..."
        $inf = @"
[Version] 
Signature="`$Windows NT`$"

[NewRequest]
Subject = "CN=$Hostname, OU=$OrganizationalUnit, O=$Organization, L=$Locality, S=$State, C=$Country"
KeySpec = 1
KeyLength = $Keylength
Exportable = TRUE
FriendlyName = "$Hostname"
MachineKeySet = TRUE
SMIME = False
PrivateKeyArchive = FALSE
UserProtected = FALSE
UseExistingKeySet = FALSE
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
RequestType = PKCS10
KeyUsage = 0xa0

[Extensions]
2.5.29.17 = "{text}"
_continue_ = "dns=$Hostname&"
"@

        $inf | Set-Content -Path $infFile

        Write-Verbose "Creating the certificate request ..."
        & certreq.exe -new "$infFile" "$requestFile"

        Write-Verbose "Submitting the certificate request to the certificate authority ..."
        & certreq.exe -submit -config "$CertificateAuthority" -attrib "CertificateTemplate:WebServer" "$requestFile" "$CertFileOut"

        if (Test-Path "$CertFileOut") {
            Write-Verbose "Installing the generated certificate ..."
            & certreq.exe -accept "$CertFileOut"
        }

    }
    Finally {
        Get-ChildItem "$workdir\$fileBaseName.*" | remove-item
    }
}

Es verwendet im Grunde nur certreg.exe anstelle nativer PowerShell-Cmdlets (ich bin nicht sicher, ob es sie gibt, und wenn doch, sind sie auf älteren Betriebssystemen normalerweise nicht vorhanden).

Die Anfragedetails befinden sich in der Zeichenfolge hier. Korrigieren Sie bei Bedarf den Betreff und andere Einstellungen. Möglicherweise möchten Sie weitere Werte nach oben in den Parameterabschnitt verschieben.

Ich erstelle eine inf-Datei für die neue Anfrage und konvertiere diese in eine Anfragedatei.

Anschließend übermittle ich die Anfrage an die in $CAName angegebene Zertifizierungsstelle. Wenn der ausführende Benutzer ein Domänenadministrator ist, wird die Anfrage sofort ausgegeben.

Abschließend schließe ich die Anfrage mit -accept ab und nehme einige Aufräumarbeiten vor.

Normalerweise exportiere ich das neue Zertifikat auch in eine PFX-Datei.

Für die IIS-Bindung und Zertifikatszuweisung können Sie etwa Folgendes verwenden:

 New-WebBinding -Name www.test.local   -Port 443 -Protocol https
 $thumb = (Get-ChildItem cert:\LocalMachine\MY | where-object { $_.FriendlyName -like "www.test.local" } | Select-Object -First 1).Thumbprint
 $guid = [guid]::NewGuid()
 & netsh http add sslcert hostnameport=www.test.local:443 certhash=$thumb appid=`{$guid`} certstorename=MY

verwandte Informationen