证书固定的取舍
证书固定让客户端只信任预先内置的证书或公钥(通常是 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 的公钥往往比固定叶证书更合适,轮换时只需更新签发侧,客户端不必跟着发版。