サイトにhttpsバインディングを追加しようとするプロセスを行ったところ、かなり苦痛になる可能性があります。各ステップを達成する方法はたくさんあり、それぞれに落とし穴があります。私は、誰かがそれが役に立つと思うことを望んで、最終的な解決策を残しています。
このソリューションは、IISがインストールされ、Webサイトが定義されていることを前提としています。この投稿の目的のために、サイト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コマンドレットを使用した副産物でした。無料で提供されていない場合、New-WebBindingコマンドレットを使用してポート80バインディングを作成するのは困難でした。