Ich habe versucht, eine https-Bindung zu einer Site hinzuzufügen, was ziemlich schmerzhaft sein kann. Es gibt viele Möglichkeiten, um jeden Schritt auszuführen, und jeder hat Fallstricke. Ich lasse die endgültige Lösung hinter mir und hoffe, dass jemand sie nützlich findet.
Diese Lösung setzt voraus, dass Sie IIS installiert und eine Website definiert haben. Rufen Sie die Site sample.contoso.com für die Zwecke dieses Beitrags auf. Angenommen, Sie haben ein Zertifikat in einer sample.contoso.com.pfx-Datei, das Sie ebenfalls verwenden möchten.
Der erste Schritt besteht darin, das Zertifikat aus der Datei zu importieren.
$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd
Es wäre schön, wenn das ausreichen würde. Und in einigen Fällen kann es sein. Für mich blieb das Zertifikat jedoch ohne ordnungsgemäßen Zugriff auf den privaten Schlüssel. Dies verursachte einen Powershell-Fehler "Eine angegebene Anmeldesitzung existiert nicht. Möglicherweise wurde sie bereits beendet", als ich das Zertifikat zur Bindung hinzufügte (siehe diesen Schritt später). Der nächste Schritt besteht also darin, die ACL für den privaten Schlüssel zu reparieren.
$privateKeyFilename = $webServerCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
$privateKeyFullPath = "c:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\"+$privateKeyFilename
$aclRule = "SYSTEM", "Full", "Allow"
$aclEntry = New-Object System.Security.AccessControl.FileSystemAccessRule $aclRule
$privateKeyAcl = (Get-Item $privateKeyFullPath).GetAccessControl("Access")
$privateKeyAcl.AddAccessRule($aclEntry)
Set-Acl $privateKeyFullPath $privateKeyAcl
Auf diese Weise kann das lokale System uneingeschränkt auf den privaten Schlüssel zugreifen, wenn dieser nicht vom übergeordneten Ordner geerbt wird.
Wenn Sie ein Zertifikat erhalten möchten, das bereits installiert ist, benötigen Sie den Hash dafür und können ihn mit Get-Item wie folgt abrufen:
$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95
Der nächste Schritt besteht darin, die Bindung zu erstellen.
New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"
Es ist wichtig zu beachten, dass "https" zwischen Groß- und Kleinschreibung unterscheidet. Wenn Sie stattdessen "HTTPS" verwenden, erhalten Sie ein wirklich anderes Bindungsergebnis.
An diese Bindung ist noch kein Zertifikat angehängt. Der letzte Schritt ist das Anhängen des Zertifikats. Wenn das Zertifikat ordnungsgemäß als vertrauenswürdig eingestuft ist und die Sicherheit korrekt ist, sollte dieser Schritt erfolgreich sein. Es kann jedoch schwierig sein, wenn ein Problem mit dem Zertifikat vorliegt.
$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")
Wenn dies mit der Meldung fehlschlägt, dass keine Anmeldesitzung vorhanden ist, liegt möglicherweise ein Problem mit dem Zertifikat vor. Überprüfen Sie die Ereignisanzeige auf weitere Details. Während meiner Bemühungen fand ich Ereignis 5061 im Sicherheitsprotokoll. Wenn es fehlschlug, zeigte es, dass OpenKey mit 80090016 fehlschlug (das Keyset existiert nicht). Der Fehler war, dass SYSTEM keinen Zugriff auf den privaten Schlüssel hatte.
Das hat mir ausgereicht, um die https-Bindung zu erstellen. Die http-Bindung war ein Nebenprodukt der Verwendung des Cmdlets New-WebSite. Wenn dies nicht kostenlos ist, empfand ich das Erstellen der Port 80-Bindung mit dem Cmdlet New-WebBinding nicht als Herausforderung.