PowerShell无法更新IIS证书,但IIS管理器可正常使用该证书
我之前在Windows Server 2019上通过Let's Encrypt+win-acme正常生成并使用SSL证书,现在更换为Windows Server 2022 Standard服务器,仍使用win-acme生成证书,且新旧服务器上使用相同的PowerShell脚本更新其他未更换服务器的IIS证书。
证书复制过程正常,且在IIS管理器中手动选择新证书后,站点可正常访问(浏览器显示证书有效)。但通过PowerShell执行脚本更新时,出现错误:指定的登录会话不存在,可能已终止
同时Windows日志→系统下的事件查看器中出现如下错误:
TLS服务器凭据的证书未附加私钥信息属性。这通常发生在证书备份不正确并随后恢复的情况下,也可能表示证书注册失败。
SSPI客户端进程为SYSTEM(PID: 4)。
脚本执行完成后,原本使用旧证书的站点在IIS管理器的SSL证书字段中被设置为“未选择”。即使在运行win-acme的本地服务器执行该脚本,问题依然存在。
附上使用的PowerShell脚本:
$thumbprintOld = "11111111111222222222222222222222222222222" $certImported = Get-ChildItem -Path cert:\LocalMachine\WebHosting | ?{ $_.Thumbprint -Eq "CA11111111111111111111111111111111111111" } Import-Module WebAdministration $bindings = Get-WebBinding foreach($b in $bindings) { if(($b.certificateHash -eq $thumbprintOld)) { Write-Host ("found host " + $b.bindingInformation) #$b.RemoveSslCertificate() $b.AddSslCertificate($certImported.GetCertHashString(), "WebHosting") } }
注:旧服务器上不需要RemoveSslCertificate(),尝试添加后问题未解决,故注释掉。
核心原因
问题根源在于证书私钥的权限配置和PowerShell操作的上下文差异:
- 手动在IIS管理器选择证书时,交互式会话会自动为IIS相关进程(如SYSTEM、w3wp)授予证书私钥的读取权限,确保服务能正常访问私钥。
- Windows Server 2022对证书私钥的权限管控比2019更严格,而PowerShell脚本执行
AddSslCertificate时,直接绑定证书但未确保SYSTEM账户(IIS服务运行身份)拥有私钥读取权限,导致绑定失败。
具体解决步骤
1. 配置证书私钥的SYSTEM权限
- 打开
证书管理器(运行certlm.msc),定位到本地计算机→WebHosting存储中的目标证书。 - 右键证书→
所有任务→管理私钥。 - 在权限窗口中添加
SYSTEM账户,授予其读取权限,保存设置。
2. 修改脚本:先解绑旧证书再绑定新证书
注释的RemoveSslCertificate()必须执行,旧证书的绑定会话可能处于占用状态,导致新证书无法正常绑定。修改后的脚本如下:
$thumbprintOld = "11111111111222222222222222222222222222222" $certImported = Get-ChildItem -Path cert:\LocalMachine\WebHosting | Where-Object { $_.Thumbprint -Eq "CA11111111111111111111111111111111111111" } Import-Module WebAdministration $bindings = Get-WebBinding foreach($b in $bindings) { if($b.certificateHash -eq $thumbprintOld) { Write-Host "found host $($b.bindingInformation)" # 移除旧证书绑定,释放会话 $b.RemoveSslCertificate() # 绑定新证书,直接使用证书对象的Thumbprint属性 $b.AddSslCertificate($certImported.Thumbprint, "WebHosting") } }
注:使用$certImported.Thumbprint代替GetCertHashString(),避免字符串格式不一致引发的问题。
3. 重启IIS服务(可选)
如果绑定后仍有异常,执行iisreset命令重启IIS,刷新所有绑定会话,确保新证书生效。
额外验证点
- 确认证书导出/导入时已包含私钥:导出证书时需勾选“导出私钥”选项,导入时确保私钥被正确恢复。
- 检查证书属性:在证书详情的“私钥”字段,确认显示“有私钥”。
内容的提问来源于stack exchange,提问作者Brian Heward

