我经历了尝试向网站添加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 cmdlet的副产品。如果不是免费提供的,我发现使用New-WebBinding cmdlet创建端口80绑定并不是一个挑战。