首页/安全/加密与证书速查/证书固定(Pinning)的取舍

证书固定(Pinning)的取舍

证书固定让客户端只信任预先内置的证书或公钥(SPKI),可抵御受信 CA 误签发;但轮换与应急成本高,Web 端 HPKP 已被废弃,移动 App 仍常用且必须准备备用固定。

加密与证书速查安全更新于 2026-10-13

证书固定的取舍

证书固定让客户端只信任预先内置的证书或公钥(通常是 SPKI 哈希),用于抵御受信 CA 误签发带来的风险。代价是轮换与应急成本高:网站端的 HPKP 已被浏览器移除,移动 App 与内网客户端仍较常见,但必须准备备用固定值并设计更新通道。做固定之前先想清楚轮换流程,再决定是否采用。

基本信息

Web 端HPKP 因自锁风险被浏览器移除,不建议在网站使用
移动 App常用 SPKI 或证书固定,需内置至少一个备用指纹
风险固定失效等于应用无法连接后台,且无法靠服务端即时修复
替代方案证书透明度监控、短有效期、私有 CA 配合网络策略
前提固定值更新通道与应急发版机制要提前设计

典型使用场景

  • 高安全要求的 App 与后台通信
  • 内网客户端与固定服务端之间的互信
  • 评估「是否要做固定」时的成本收益分析
  • 排查固定导致的客户端连接失败
  • 设计备用固定值与轮换流程

计算 SPKI 固定值

计算 SPKI 固定值
# 当前证书的 SPKI 哈希(供客户端内置)
openssl x509 -in cert.pem -noout -pubkey | openssl pkey -pubin -outform DER | openssl dgst -sha256 -binary | openssl base64
# 叶证书指纹,用于对比
openssl x509 -in cert.pem -noout -fingerprint -sha256
# 提前计算备用证书的 SPKI 并一起内置
openssl x509 -in next.crt -noout -pubkey | openssl pkey -pubin -outform DER | openssl dgst -sha256 -binary | openssl base64

固定对象选择

对象稳定性建议
叶证书指纹每次续期都会变化不推荐长期固定
SPKI 哈希仅在换密钥时变化常用选择
中间证书更换 CA 时会变化视 CA 稳定性评估
根证书变化最少粒度粗,收益有限
做固定前先设计轮换流程:备用指纹、灰度下线旧指纹、应急版本通道缺一不可。任何一项缺失,都会在某次证书轮换时变成全量客户端不可用的线上事故。
补充:内网客户端做固定时同样要保留备用值。由于内网证书常由自有 CA 签发,固定中间证书或指定 CA 的公钥往往比固定叶证书更合适,轮换时只需更新签发侧,客户端不必跟着发版。

易错点

  • 只固定当前证书而不固定根或备用值 → 轮换即断网,服务端无法即时补救
  • 在网站继续使用已被浏览器移除的 HPKP → 策略不生效,还留下自锁风险
  • 固定值无法通过配置更新 → 只能依赖用户升级,修复周期完全不可控
  • 把固定当作取代证书链校验 → 两者职责不同,仍需完整校验链与域名

数据来源与参考

  • RFC 7469(HPKP,已废弃)
  • OWASP Pinning Cheat Sheet
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌