# 证书锁定是什么？定义、例子与常见误区

> 证书锁定是客户端侧的一项检查：只有服务器证书链中包含事先配置好的特定证书或公钥时，客户端才接受这次连接。

Source: https://ssl.sh/zh/glossary/certificate-pinning/
Last updated: 2026-11-10

证书锁定（也常叫 SSL Pinning）指客户端为某个主机预先保存预期的证书，或者更常见的，保存其公钥信息（SPKI）的哈希；即使对方证书链本身有效且受信任，只要不匹配就拒绝连接。它主要用于移动 App、IoT 设备等访问自家 API 的客户端。浏览器曾通过 [HPKP](https://ssl.sh/zh/glossary/hpkp/)（RFC 7469）支持网站动态声明锁定，但由于配置失误可能让整个网站无法访问，Chrome 72 已将其移除。

## 为什么重要
锁定把信任范围从信任库里的所有 CA 缩小到你指定的密钥，错误签发的证书或本机安装的企业根证书都无法截获 App 的流量。这也是为什么启用锁定的 App 在企业 [SSL 解密检测](https://ssl.sh/zh/glossary/ssl-inspection/)网关后面会连不上。最大的风险是“锁死”：被锁定的密钥一旦更换而又没有备用 pin，所有已安装的客户端都会断连，直到用户升级 App。证书最长有效期从 2026-03-15 起为 200 天，2029-03-15 起降到 47 天，锁定叶子证书非常脆弱；锁定 CA 的[中间证书](https://ssl.sh/zh/glossary/intermediate-certificate/)也不稳妥，Let's Encrypt 在 2026 年就把签发切换到了新的证书层级。建议锁定自己掌控的密钥，并始终附带备用 pin；很多团队也可以改用 [证书透明度](https://ssl.sh/zh/glossary/certificate-transparency/) 监控这种风险更低的方案。

## 例子
计算 base64 编码的 SHA-256 SPKI pin，Android Network Security Config 和当年的 HPKP 都用这种格式：

```bash
openssl x509 -in cert.pem -noout -pubkey \
  | openssl pkey -pubin -outform der \
  | openssl dgst -sha256 -binary | openssl enc -base64
```

## 常见误区
- **锁定叶子证书最安全。** 除非续签时沿用同一私钥，否则每次续签都会失效；应锁定公钥而非证书，并保留备用 pin。
- **HPKP 仍能保护网站。** 主流浏览器早已不再执行 HPKP 响应头。
- **有了锁定就不用常规证书校验。** 锁定是在证书链和域名校验之上的附加检查，不能替代它们。

## 相关术语

- [HPKP](https://ssl.sh/zh/glossary/hpkp/): HPKP 是 RFC 7469 定义、现已废弃的 HTTP 响应头，要求浏览器只在证书链包含指定公钥时才接受该网站。
- [公钥](https://ssl.sh/zh/glossary/public-key/): 公钥是非对称密钥对中可以公开的一半，写在证书里，供他人验证由对应私钥生成的签名。
- [证书透明度](https://ssl.sh/zh/glossary/certificate-transparency/): 证书透明度（CT）是一套公开、只可追加的日志系统，记录所有公开信任的 TLS 证书，让任何人都能审计 CA 签发了什么。
- [SSL 解密检测](https://ssl.sh/zh/glossary/ssl-inspection/): SSL 解密检测是企业安全网关借助受管设备信任的私有 CA，对 TLS 流量进行解密、检查后再重新加密的做法。
- [中间证书](https://ssl.sh/zh/glossary/intermediate-certificate/): 中间证书是由根证书（或上级中间证书）签发、用来签发网站证书的 CA 证书，服务器必须把它和网站证书一起发送给客户端。
- [密钥轮换](https://ssl.sh/zh/glossary/key-rotation/): 密钥轮换是按计划或在安全事件后，用新生成的密钥替换旧密钥，以限制密钥泄露造成损失的做法。
