# A specified logon session does not exist：IIS 绑定证书报错

> IIS 绑定 HTTPS 时报这个错（0x80070520），意思是证书的私钥缺失或无法访问。怎么检查私钥、重新导入 PFX 并重新绑定。

Source: https://ssl.sh/zh/errors/iis-specified-logon-session-does-not-exist/
Last updated: 2026-11-10

**“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 管理器 > 网站 > 绑定 > 添加或编辑，选中证书点确定后：

```text
A specified logon session does not exist. It may already have been terminated.
(Exception from HRESULT: 0x80070520)
```

`0x80070520` 是 Win32 错误 1312（0x520）的 HRESULT 写法。用 `netsh` 时：

```text
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 检查：

```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` 下的私钥文件没有权限。微软另有文档说明这个文件夹的默认权限。用下面的命令检查私钥：

```bash
certutil -verifystore My <证书指纹>
```

输出里要有“Encryption test passed”（中文系统显示对应的中文），失败说明私钥缺失或读不了。

### 4. 克隆或还原后证书和私钥的关联断了

从镜像克隆或从备份还原的服务器，有时证书还在，但和私钥的关联已经失效。如果私钥确实在这台机器上，`certutil -repairstore` 可以重建关联：

```bash
certutil -repairstore My <证书序列号>
```

## 排查前先确认三件事

文件类型、CSR 生成位置和导入的存储，这三项能定位绝大多数情况。

1. **证书文件的类型。** `.pfx` 或 `.p12` 才可能带私钥；`.cer`、`.crt`、`.pem` 一般只有证书。已经导入的证书，可以在 `certlm.msc` 里打开，看“常规”页底部是否提示有对应的私钥，证书图标上也会多一把小钥匙。
2. **CSR 是在哪台机器上生成的。** 如果是在 IIS 管理器里“创建证书申请”生成的，私钥就在那台服务器上，换一台机器完成申请一定失败。
3. **导入到了哪个存储。** IIS 只使用“本地计算机”下的证书。导入向导第一页的“存储位置”要选“本地计算机”，而不是默认的“当前用户”。

## 怎么修

可靠的修法是删掉有问题的证书，把带私钥的 PFX 导入“本地计算机 > 个人”，再重新绑定。

**1. 拿到包含私钥的 PFX。** 只有证书文件的话，从生成 CSR 的那台服务器导出 PFX，或者用 [证书格式转换](https://ssl.sh/zh/tools/ssl-converter/) 把 PEM 格式的证书和私钥合成 PFX；合成前用 [私钥匹配检查](https://ssl.sh/zh/tools/key-matcher/) 确认私钥和证书是一对。

**2. 删掉有问题的副本**，“本地计算机 > 个人”和“当前用户 > 个人”里的都删（分别用 `certlm.msc` 和 `certmgr.msc` 打开）。

**3. 导入到“本地计算机 > 个人”：**

```powershell
$pw = Read-Host -AsSecureString
Import-PfxCertificate -FilePath C:\certs\example.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $pw
```

只有以后确实需要迁移证书时才加 `-Exportable`。

**4. 重新绑定。** 在 IIS 管理器里重新选择证书，或者用 netsh 按证书指纹绑定：

```bash
netsh http add sslcert hostnameport=example.com:443 certhash=<证书指纹> appid={00000000-0000-0000-0000-000000000000} certstorename=MY
```

**5. 私钥在但访问失败时**，按微软文档把 MachineKeys 文件夹恢复成默认权限，不要随手放开大权限。

在 IIS 上安装证书的完整步骤见 [IIS 安装 SSL 证书](https://ssl.sh/zh/guides/iis-ssl-certificate/)。

## 续期时怎么避免再遇到

这个错误大多出现在手动续期时：在错误的机器上完成了申请，或者导入了错误的文件。CSR 在哪台服务器生成，就在哪台完成申请；或者直接让 CA 或云厂商提供带私钥的 PFX。带密码的 PFX 备份要放在安全的地方。公共证书最长有效期已经降到 200 天，2027 年 3 月还会降到 100 天，用 win-acme 这类会自动续期并更新绑定的 ACME 客户端，可以省掉手动操作。

## 怎么确认已经修好

修好的标准是证书显示 `HasPrivateKey : True`，并且 HTTPS 绑定能正常保存。

1. `Get-ChildItem Cert:\LocalMachine\My` 显示这张证书 `HasPrivateKey : True`。
2. `certutil -verifystore My <证书指纹>` 显示加密测试通过。
3. 绑定能正常保存，`netsh http show sslcert` 里能看到正确的证书哈希。
4. 打开网站，用 [SSL 检测](https://ssl.sh/zh/tools/ssl-checker/) 确认用的是新证书；如果握手仍然失败，看 [Schannel 错误](https://ssl.sh/zh/errors/windows-schannel-errors/)。
