证书固定失效排查
启用了证书固定的客户端只信任预先内置的指纹,一旦证书轮换就会出现握手失败——因为固定值仍是旧证书或旧公钥的哈希。排查的关键动作,是把「客户端内置的固定值」与「当前链上材料的实际指纹」逐项比对,确认失配发生在哪一层;修复方向则是把固定对象从叶证书改为公钥或中间证书、内置多组固定值,并让固定值能通过配置下发更新,而不是每次靠发版。
基本信息
| 固定对象 | 叶证书指纹、公钥(SPKI)哈希或中间证书指纹 |
|---|---|
| 失效触发点 | 证书提前轮换、CA 变更、链上材料变化 |
| 缓解策略 | 固定公钥或中间证书、配置多组固定值、支持配置下发 |
| 与 HPKP 区别 | Web 端 HPKP 已被浏览器移除,这里的固定通常指移动 App 或内网客户端 |
| 影响面 | 固定失效等于客户端完全无法连接,服务端无法即时修复 |
典型使用场景
- App 上线后服务端证书轮换,部分老版本客户端无法连接
- 排查「同一域名不同客户端表现不一致」:老版本内置了旧指纹
- 制定证书轮换计划时评估固定带来的发版依赖
- 安全评审要求做固定,需要同时说明运维与应急成本
- 事件复盘中区分「固定导致失败」与「网络或 DNS 问题」
核对当前链的指纹
核对当前链的指纹
# 叶证书指纹
openssl s_client -connect api.example.com:443 -servername api.example.com </dev/null 2>/dev/null | openssl x509 -noout -fingerprint -sha256
# 公钥(SPKI)指纹,适合作为固定对象
openssl s_client -connect api.example.com:443 -servername api.example.com </dev/null 2>/dev/null | openssl x509 -noout -pubkey | openssl pkey -pubin -outform DER | openssl dgst -sha256 -binary | openssl base64固定对象对比
| 固定对象 | 轮换影响 | 建议 |
|---|---|---|
| 叶证书指纹 | 每次续期都会变化 | 避免长期使用 |
| 公钥(SPKI) | 仅在换密钥时变化 | 续期复用密钥时更稳 |
| 中间证书 | 更换 CA 时会变化 | 需先评估 CA 稳定性 |
| 根证书 | 变化最少 | 粒度最粗,安全收益最低 |
当更新固定值必须发版时,证书轮换就要提前规划时间窗:服务端切换与客户端发版要错开或配合,否则会出现「服务端已换、老版本 App 连不上」的线上事故,而且服务端无法补救。