Я попытался добавить привязку https к сайту, и это может быть довольно болезненным. Есть много способов выполнить каждый шаг, и у каждого есть свои подводные камни. Я оставляю окончательное решение в надежде, что кто-то найдет его полезным.
Это решение предполагает, что у вас установлен IIS и определен веб-сайт. Позвоните на сайт sample.contoso.com для целей этого поста. Предположим, у вас есть сертификат в файле sample.contoso.com.pfx, который вы также хотите использовать.
Первым шагом является импорт сертификата из файла.
$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd
Было бы хорошо, если бы этого было достаточно. И в некоторых случаях это может быть. Однако для меня это оставило сертификат без надлежащего доступа к закрытому ключу. Это вызвало ошибку powershell «Указанный сеанс входа не существует. Возможно, он уже был прерван», когда я пошел, чтобы добавить сертификат в привязку (см. Этот шаг позже). Итак, следующим шагом является исправление ACL для закрытого ключа.
$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
Это позволит локальной системе иметь полный доступ к закрытому ключу, если он не унаследован от содержащей папки.
Если вы хотите получить сертификат, который уже установлен, вам нужен хеш для него и вы можете получить его с помощью Get-Item следующим образом:
$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95
Следующим шагом является создание привязки.
New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"
Важно отметить, что «https» чувствителен к регистру. Если вместо этого вы используете «HTTPS», вы получите действительно другой результат привязки.
К этой привязке еще не прикреплен сертификат, поэтому последний шаг - прикрепить сертификат. Если сертификат правильно доверенный и безопасность правильная, этот шаг должен быть успешным. Это может быть привередливым, если есть какие-либо проблемы с сертификатом, хотя.
$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")
Если это не удается с сообщением о том, что сеанс входа в систему не существует, то сертификат может иметь некоторые проблемы. Просмотрите программу просмотра событий для получения более подробной информации. Во время своих усилий я обнаружил событие 5061 в журнале безопасности. Когда это не удалось, он показал, что OpenKey не удалось с 80090016 (набор ключей не существует). И ошибка была в том, что у SYSTEM не было доступа к закрытому ключу.
Этого было достаточно для создания привязки https. Привязка http была побочным продуктом использования командлета New-WebSite. Если это не бесплатно, я не считаю создание привязки порта 80 с помощью командлета New-WebBinding.