服务器和代理
A specified logon session does not exist:IIS 绑定证书报错
A specified logon session does not exist. It may already have been terminated.“A specified logon session does not exist. It may already have been terminated.” 的意思是:你想绑定到 HTTPS 站点的证书,Windows 打不开它的私钥。 这句话是 Windows 通用的系统错误 1312(ERROR_NO_SUCH_LOGON_SESSION),字面上和证书无关,中文版 Windows 显示对应的中文译文。IIS 在添加或编辑 HTTPS 绑定时弹出它;netsh http add sslcert 则报错误 1312。几乎所有情况下,证书都在存储里,只是私钥不存在、放错了存储位置,或者系统无权访问。
报错长什么样
IIS 管理器会把这句英文和 HRESULT 0x80070520 一起显示,netsh 则只给出错误码 1312。
在 IIS 管理器 > 网站 > 绑定 > 添加或编辑,选中证书点确定后:
A specified logon session does not exist. It may already have been terminated.
(Exception from HRESULT: 0x80070520)
0x80070520 是 Win32 错误 1312(0x520)的 HRESULT 写法。用 netsh 时:
SSL Certificate add failed, Error: 1312
为什么报错里会提到“登录会话”
报错提到“登录会话”,是因为 Windows 所有组件共用一张系统错误代码表,IIS 只是原样转述了 1312 这个码的文字。1312 位于安全和账户相关的错误区段,旁边就是 1326 ERROR_LOGON_FAILURE(用户名或密码不正确)。IIS 在创建绑定时拿到哪个错误码,就显示表里对应的标准文字,所以措辞来自那张表,和用户登录没有关系。遇到它,就把它理解为“这张证书的私钥在这里用不了”。如果去服务器上排查登录、会话之类的问题,只会白费功夫。
常见原因(按出现频率排序)
最常见的原因是这台服务器上没有证书的私钥,另外 3 种是私钥存在,但 IIS 用不了。
1. 这台服务器上没有证书的私钥
导入的是 .cer 或 .crt 文件,这类文件本来就不含私钥;或者在另一台服务器上点了“完成证书申请”,而 CSR 不是那台机器生成的。证书出现在存储里,但不能用于 TLS。国内常见的情况是:在阿里云、腾讯云下载证书时选了 Nginx 或 Apache 格式(证书和私钥是分开的两个文件),然后只把证书文件导入了 Windows。给 IIS 用应当下载 IIS 格式,里面是带私钥的 PFX 文件和它的密码。
用 PowerShell 检查:
Get-ChildItem Cert:\LocalMachine\My | Format-List Subject, Thumbprint, HasPrivateKey, NotAfter
显示 HasPrivateKey : False 就可以确认。
2. 证书和私钥在“当前用户”存储里
双击 PFX 打开的导入向导,默认选中的是“当前用户”。导入到那里的私钥属于你的用户配置文件,之后在控制台里只把证书挪到“本地计算机”,私钥可能留在原处,通过系统服务工作的 IIS 就打不开它。打开 certmgr.msc(当前用户)看看是不是还有一份。
3. 系统无权访问私钥文件
微软存档的一篇 IIS 支持文章讲了这样一个案例:证书在 IIS 6 上正常,到了 IIS 7 绑定时就报这个错。certutil 校验显示加密测试失败,原因是 Administrators 组对 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 下的私钥文件没有权限。微软另有文档说明这个文件夹的默认权限。用下面的命令检查私钥:
certutil -verifystore My <证书指纹>
输出里要有“Encryption test passed”(中文系统显示对应的中文),失败说明私钥缺失或读不了。
4. 克隆或还原后证书和私钥的关联断了
从镜像克隆或从备份还原的服务器,有时证书还在,但和私钥的关联已经失效。如果私钥确实在这台机器上,certutil -repairstore 可以重建关联:
certutil -repairstore My <证书序列号>
排查前先确认三件事
文件类型、CSR 生成位置和导入的存储,这三项能定位绝大多数情况。
- 证书文件的类型。
.pfx或.p12才可能带私钥;.cer、.crt、.pem一般只有证书。已经导入的证书,可以在certlm.msc里打开,看“常规”页底部是否提示有对应的私钥,证书图标上也会多一把小钥匙。 - CSR 是在哪台机器上生成的。 如果是在 IIS 管理器里“创建证书申请”生成的,私钥就在那台服务器上,换一台机器完成申请一定失败。
- 导入到了哪个存储。 IIS 只使用“本地计算机”下的证书。导入向导第一页的“存储位置”要选“本地计算机”,而不是默认的“当前用户”。
怎么修
可靠的修法是删掉有问题的证书,把带私钥的 PFX 导入“本地计算机 > 个人”,再重新绑定。
1. 拿到包含私钥的 PFX。 只有证书文件的话,从生成 CSR 的那台服务器导出 PFX,或者用 证书格式转换 把 PEM 格式的证书和私钥合成 PFX;合成前用 私钥匹配检查 确认私钥和证书是一对。
2. 删掉有问题的副本,“本地计算机 > 个人”和“当前用户 > 个人”里的都删(分别用 certlm.msc 和 certmgr.msc 打开)。
3. 导入到“本地计算机 > 个人”:
$pw = Read-Host -AsSecureString
Import-PfxCertificate -FilePath C:\certs\example.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $pw
只有以后确实需要迁移证书时才加 -Exportable。
4. 重新绑定。 在 IIS 管理器里重新选择证书,或者用 netsh 按证书指纹绑定:
netsh http add sslcert hostnameport=example.com:443 certhash=<证书指纹> appid={00000000-0000-0000-0000-000000000000} certstorename=MY
5. 私钥在但访问失败时,按微软文档把 MachineKeys 文件夹恢复成默认权限,不要随手放开大权限。
在 IIS 上安装证书的完整步骤见 IIS 安装 SSL 证书。
续期时怎么避免再遇到
这个错误大多出现在手动续期时:在错误的机器上完成了申请,或者导入了错误的文件。CSR 在哪台服务器生成,就在哪台完成申请;或者直接让 CA 或云厂商提供带私钥的 PFX。带密码的 PFX 备份要放在安全的地方。公共证书最长有效期已经降到 200 天,2027 年 3 月还会降到 100 天,用 win-acme 这类会自动续期并更新绑定的 ACME 客户端,可以省掉手动操作。
怎么确认已经修好
修好的标准是证书显示 HasPrivateKey : True,并且 HTTPS 绑定能正常保存。
Get-ChildItem Cert:\LocalMachine\My显示这张证书HasPrivateKey : True。certutil -verifystore My <证书指纹>显示加密测试通过。- 绑定能正常保存,
netsh http show sslcert里能看到正确的证书哈希。 - 打开网站,用 SSL 检测 确认用的是新证书;如果握手仍然失败,看 Schannel 错误。
常见问题
证书请求是在另一台服务器上完成的,能在这台上修吗?
不能。“完成证书申请”只能在生成 CSR 的那台服务器上做,因为私钥是在那台机器上生成的。要么从原服务器导出 PFX,要么在这台服务器上重新生成 CSR 并让 CA 重新签发。
要不要给 MachineKeys 文件夹加上 Everyone 完全控制?
不要。按微软文档恢复默认权限即可。微软那篇存档文章的处理是给 Administrators 组完全控制权限;放开太大的权限会让其他用户也能读到你的私钥。
导入时勾不勾“标志此密钥为可导出”有关系吗?
可导出与否不影响 IIS 能不能使用私钥。很多人反馈勾选后重新导入就好了,起作用的是“重新导入”本身重建了证书和私钥的关联。只有以后需要迁移证书时才勾选,并保管好 PFX 文件。
IIS 上用 Let's Encrypt,怎么避免这个问题?
用会把证书装进“本地计算机”存储并自动更新绑定的 ACME 客户端,比如 win-acme,见 win-acme 教程。