HTTP公钥固定(HPKP)详解
字数 1228 2025-11-14 16:46:28
HTTP公钥固定(HPKP)详解
一、知识点描述
HTTP公钥固定(HTTP Public Key Pinning,HPKP)是一种安全机制,允许网站告知浏览器:"在未来的某段时间内,只应接受由特定公钥或证书颁发机构(CA)签发的本网站证书"。它的核心目的是防范证书颁发机构被入侵或错误签发证书导致的中介攻击。
二、背景与需求
- 问题根源:传统HTTPS依赖CA体系,如果任意一个受信任的CA被攻击者控制(或CA错误签发证书),攻击者即可伪造该网站的证书实施中间人攻击。
- 典型案例:2011年荷兰CA DigiNotar被入侵,攻击者伪造了Google等网站的证书,实施了大规模监听。
三、HPKP工作原理
-
首次访问固定:
- 网站服务器通过HTTP响应头
Public-Key-Pins(或Public-Key-Pins-Report-Only)下发公钥固定策略。 - 浏览器记录该策略,并在后续访问中强制执行。
- 网站服务器通过HTTP响应头
-
策略头示例:
Public-Key-Pins: pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM="; pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g="; max-age=5184000; includeSubDomains; report-uri="https://example.com/hpkp-report" -
参数解析:
pin-sha256:公钥的Base64编码SHA-256哈希值(需至少配置两个pin,一个当前使用,一个备用)。max-age:策略有效期(秒),期间浏览器会拒绝不符合pin的证书。includeSubDomains:策略应用于所有子域名。report-uri(可选):违反策略时发送报告的位置。
四、部署步骤详解
-
生成备份密钥对:
- 创建备用RSA/ECC密钥对,确保主密钥失效时可通过备用密钥恢复访问。
- 存储备用私钥至离线安全环境。
-
计算公钥指纹:
- 提取证书中的公钥(非整个证书),计算其SHA-256哈希值。
- 示例命令(OpenSSL):
openssl x509 -in certificate.pem -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
-
配置HTTP响应头:
- 在Web服务器(如Nginx/Apache)中添加HPKP头,包含当前证书和备用证书的pin。
- 首次建议使用
Public-Key-Pins-Report-Only模式(仅报告不阻断),验证无误后切换为强制执行。
五、风险与注意事项
- 锁定风险:若所有已固定的密钥丢失或CA变更未及时更新pin,用户将在
max-age内无法访问网站(俗称"HPKP自杀")。 - 备用密钥必要性:必须配置备用pin,且备用私钥需离线保存,仅在主密钥失效时使用。
- 有效期控制:
max-age不宜过短(易被绕过)或过长(增加恢复难度),通常建议数月至一年。
六、替代方案与现状
- Certificate Transparency(CT):通过公开日志记录证书签发,辅助检测恶意证书,逐渐成为主流替代方案。
- HPKP弃用:因部署复杂性和风险过高,主流浏览器已弃用HPKP,转向基于CT的机制(如Expect-CT头)。
七、总结
HPKP通过强制绑定公钥提升了HTTPS链信任的安全性,但实际部署需严格遵循密钥备份和生命周期管理。当前更推荐采用Certificate Transparency等更稳健的机制实现类似安全目标。