Przeszedłem przez proces dodawania powiązania https do witryny i może to być dość bolesne. Istnieje wiele sposobów na osiągnięcie każdego kroku i każdy z nich ma pułapki. Zostawiam ostatnie rozwiązanie, mając nadzieję, że ktoś uzna je za przydatne.
To rozwiązanie zakłada, że masz zainstalowane IIS i zdefiniowano witrynę internetową. Zadzwoń na stronę sample.contoso.com do celów tego postu. Załóżmy, że masz certyfikat w pliku sample.contoso.com.pfx, którego również chcesz użyć.
Pierwszym krokiem jest zaimportowanie certyfikatu z pliku.
$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd
Byłoby miło, gdyby to wystarczyło. A w niektórych przypadkach może tak być. Jednak dla mnie pozostawiło to certyfikat bez odpowiedniego dostępu do klucza prywatnego. Spowodowało to błąd PowerShell „Określona sesja logowania nie istnieje. Być może została już zakończona”, gdy poszedłem dodać certyfikat do powiązania (zobacz ten krok później). Kolejnym krokiem jest naprawa listy ACL dla klucza prywatnego.
$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
Umożliwi to systemowi lokalnemu pełny dostęp do klucza prywatnego, jeśli nie zostanie on odziedziczony z folderu zawierającego.
Jeśli chcesz uzyskać certyfikat, który jest już zainstalowany, potrzebujesz do niego skrótu i możesz go pobrać za pomocą Get-Item:
$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95
Następnym krokiem jest utworzenie powiązania.
New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"
Należy zauważyć, że w „https” rozróżniana jest wielkość liter. Jeśli zamiast tego użyjesz „HTTPS”, otrzymasz naprawdę inny wynik wiązania.
Wiązanie to nie ma jeszcze dołączonego certyfikatu, więc ostatnim krokiem jest dołączenie certyfikatu. Jeśli certyfikat jest poprawnie zaufany, a bezpieczeństwo jest prawidłowe, ten krok powinien zakończyć się powodzeniem. Może to być trudne, jeśli wystąpią jakiekolwiek problemy z certyfikatem.
$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")
Jeśli to się nie powiedzie, komunikat o sesji logowania nie istnieje, może to oznaczać problem z certyfikatem. Przejrzyj przeglądarkę zdarzeń, aby uzyskać więcej informacji. Podczas moich wysiłków znalazłem zdarzenie 5061 w dzienniku bezpieczeństwa. Gdy zawiodło, pokazało, że OpenKey zawiódł z 80090016 (zestaw kluczy nie istnieje). A błąd polegał na tym, że SYSTEM nie miał dostępu do klucza prywatnego.
To wystarczyło mi, aby utworzyć powiązanie https. Powiązanie http było produktem ubocznym użycia polecenia cmdlet New-WebSite. Jeśli nie przyjdzie za darmo, tworzenie powiązania portu 80 za pomocą polecenia cmdlet New-WebBinding nie jest wyzwaniem.