Я пройшов процес спроби додати прив'язку 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
Було б добре, якби цього було достатньо. А в деяких випадках це може бути. Однак для мене це дозволило залишити сертифікат без належного доступу до приватного ключа. Це спричинило помилку в оболонці повноважень "Вказаний сеанс входу не існує. Можливо, його вже припинено", коли я пішов додати сертифікат до прив'язки (див. Цей крок пізніше). Отже, наступним кроком є налаштування 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 не викликом.