You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell无法更新IIS证书,但IIS管理器可正常使用该证书

问题:PowerShell更新IIS SSL证书失败,手动操作却正常

我之前在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:15:22