什么是证书固定(Certificate Pinning)?它有什么风险?
简化版
证书固定是客户端内置或保存服务端证书/公钥指纹,连接时除了验证证书链,还要求证书或公钥匹配固定值。它能降低误签发 CA 或本地被植入根证书的风险,但证书轮换、过期和应急替换会变复杂,配置错误可能导致大面积不可用。
详细版
普通 HTTPS 信任系统 CA。只要证书链能连到受信任根 CA,客户端就接受。证书固定进一步要求“必须是我指定的证书或公钥”。
常见做法:
- 固定叶子证书指纹:最严格,但证书一换就要更新客户端。
- 固定公钥 SPKI 指纹:证书续期但公钥不变时仍可用。
- 固定中间 CA 或自有 CA:灵活一些,但安全边界更宽。
- 准备 backup pin:避免主证书轮换时客户端全挂。
它常用于移动 App、高安全客户端,不适合随意在 Web 上滥用。现代浏览器已不推荐 HPKP,因为误配置风险太高。
完整版教学
一、证书固定想解决什么问题
普通 HTTPS 的信任基础是系统根证书库。只要某个受信任 CA 给攻击者误签了目标域名证书,或用户设备被安装了恶意根证书,客户端可能仍会认为连接可信。
证书固定增加一道本地约束:不仅证书链要可信,还要匹配客户端预期的证书或公钥。
普通 HTTPS:
chain trusted + domain match -> accept
Pinning:
chain trusted + domain match + pin match -> accept
记忆钩子:证书链说“这张证书是可信 CA 签的”,Pinning 说“还必须是我认准的那一把钥匙”。
二、固定证书、固定公钥、固定 CA 的区别
固定粒度越细,安全性越强,但运维越难。固定叶子证书最严格,证书续期就可能失效;固定公钥更常见,因为证书可续期但密钥对保持不变;固定自有 CA 则更灵活。
| 固定对象 | 安全性 | 运维难度 | 风险 |
|---|---|---|---|
| 叶子证书 | 高 | 高 | 证书更新必须发版 |
| SPKI 公钥 | 较高 | 中 | 换密钥要提前准备 |
| 中间/私有 CA | 中 | 较低 | 信任范围更大 |
例如 App 固定了叶子证书,证书有效期 90 天,但用户 120 天没更新 App,证书轮换后老 App 全部连不上。
三、为什么要 backup pin
如果只固定一个 pin,一旦私钥泄露或证书需要紧急更换,客户端无法接受新证书。backup pin 是提前把备用公钥指纹放进客户端,平时不用,事故时切换到备用证书。
pins:
primary_spki = A
backup_spki = B
正常:服务器用 A
事故:切到 B,旧客户端仍可连接
没有 backup pin 的固定策略很脆弱。安全机制本来是为了降低风险,但没有应急通道时,它自己会变成可用性风险。
四、HPKP 为什么不推荐了
HPKP 曾允许网站通过 HTTP 响应头告诉浏览器固定公钥。但它风险很高:一旦站点误配置 pin,浏览器会在缓存期内拒绝访问,站点可能把自己锁死;攻击者若能短暂注入恶意 HPKP,也可能造成长期拒绝服务。
Public-Key-Pins: pin-sha256="..."; max-age=5184000
因此现代浏览器不再推荐 HPKP。现在证书固定更常见于 App 内部实现、企业客户端或特定 SDK。
五、Pinning 和抓包代理的冲突
开发测试常用 Charles、Fiddler、mitmproxy 安装本地根证书解密 HTTPS。普通 HTTPS 会信任这个本地根证书,但启用 Pinning 的 App 会发现证书或公钥不匹配,从而拒绝连接。
这既是安全价值,也是测试成本。团队通常需要 debug 包关闭 pinning,或在测试环境使用单独 pin,避免影响线上安全策略。
| 场景 | Pinning 行为 |
|---|---|
| 公共 CA 正常证书 | 通过 |
| 企业代理替换证书 | 可能失败 |
| 本机抓包代理 | 通常失败 |
| 误签发证书 | 可阻断 |
六、工程落地如何更稳
证书固定要配套发布节奏和监控。客户端发版周期长时,不应固定短周期叶子证书;应优先固定 SPKI,并准备至少一个 backup pin。服务端证书轮换前,要确认存量客户端都包含新 pin。
稳妥流程:
1. 当前版本内置 pin A + backup pin B
2. 服务端仍使用 A
3. 新版本逐步覆盖
4. 需要轮换时切到 B
5. 下一版本加入新的 backup C
这套流程看似麻烦,但能避免“一换证书,全量客户端断网”的事故。
七、常见误区与追问
- 误区:证书固定越严格越好。 粒度越严格,证书轮换和应急替换越难,可能牺牲可用性。
- 误区:Pinning 可以替代证书链校验。 它是额外约束,基础的证书链、域名、有效期仍要验证。
- 误区:Web 站点都应该开启 HPKP。 HPKP 误配置风险高,现代浏览器已不推荐。
- 追问:固定证书和固定公钥哪个更常见? 固定 SPKI 公钥更稳,证书续期时可复用同一公钥。
- 追问:为什么要 backup pin? 为私钥泄露、证书轮换和应急替换预留可用通道。
- 追问:Pinning 为什么会影响抓包? 抓包代理替换证书后公钥不匹配,客户端会拒绝连接。
八、加强记忆
证书固定是 HTTPS 的“额外白名单”:除了 CA 可信,还必须匹配客户端固定的证书或公钥。它能防误签发和本地恶意根证书,但运维风险很高,必须准备 backup pin、轮换流程和测试策略。