HTTP公钥固定(HPKP)模拟演示 - 使用教程
在开始使用本工具之前,建议先了解HPKP的基本概念。HPKP(HTTP Public Key Pinning)是浏览器实现的一种安全机制,网站通过Public-Key-Pins响应头告知浏览器应该信任哪些公钥。
HPKP的核心思想是"公钥固定":浏览器首次访问网站时记住其公钥指纹,后续访问时验证服务器证书链中是否包含这些指纹。如果指纹不匹配,说明可能发生了中间人攻击或证书被替换,浏览器将拒绝连接。
HPKP头的格式如下:
Public-Key-Pins: pin-sha256="base64_primary=="; pin-sha256="base64_backup=="; max-age=5184000; includeSubDomains; report-uri="https://example.com/hpkp-report"
其中pin-sha256是公钥的SPKI SHA-256哈希值的Base64编码,max-age是PIN的缓存时间(秒),includeSubDomains表示策略是否应用于子域名,report-uri是违规报告的接收地址。
点击页面上的"生成密钥对"按钮,工具将使用Web Crypto API在浏览器端生成一个ECDSA P-256密钥对。ECDSA(椭圆曲线数字签名算法)是目前最安全的公钥密码算法之一,P-256是NIST定义的标准椭圆曲线。
生成过程完全在浏览器端完成,密钥数据不会上传到任何服务器。这保证了密钥的安全性,也方便用户在离线环境中使用本工具。
密钥生成的技术细节:
- 使用浏览器原生crypto.subtle.generateKey API
- 曲线参数为P-256(也称为secp256r1或prime256v1)
- 生成的密钥对包含公钥和私钥,私钥用于模拟证书签名
- 公钥会被导出为SPKI格式的ArrayBuffer
建议一次生成至少2个密钥对:一个模拟当前服务器证书的公钥,另一个模拟备份证书的公钥。这是HPKP的最佳实践——始终保留至少一个备份PIN值,以防当前证书密钥泄露或需要更换。
密钥对生成后,工具会自动计算并显示每个公钥的SPKI SHA-256 PIN值。PIN值的计算过程包括:
- 从ECDSA公钥中提取原始公钥字节(65字节非压缩格式)
- 将公钥字节包装为SPKI ASN.1结构
- 对完整的SPKI字节序列进行SHA-256哈希运算
- 将32字节的哈希结果进行Base64编码
SPKI(Subject Public Key Info)是X.509证书中存储公钥信息的标准格式。通过固定SPKI的哈希值,可以确保证书链中使用的公钥没有被篡改,即使证书本身被替换。
pin-sha256="YEQK4tMHDm3S7NVpUVK0fJ3x6UvL+9C0r0z7fHk8xWs="
请妥善记录这些PIN值,它们将用于构建HPKP响应头。如果使用了includeSubDomains指令,这些PIN将应用于所有子域名。
在配置面板中,您可以调整以下HPKP参数:
max-age设置
max-age指令指定PIN值的缓存时间(秒)。建议从较短的时间(如300秒)开始测试,确认配置正确后再逐步增加到生产级别(通常为15-180天)。如果在max-age过期前未能续期PIN,浏览器会清除缓存,相当于HPKP策略失效。
includeSubDomains开关
启用此选项后,HPKP策略将应用于当前域名及其所有子域名。这在保护通配符证书时非常有用,但也增加了误配置的风险。例如,如果主站配置了HPKP但子站没有相应配置证书,子站将无法正常访问。
Report-Only模式
推荐在正式部署前使用Report-Only模式(Public-Key-Pins-Report-Only头)。在此模式下,浏览器只会发送违规报告而不会实际阻止连接,这允许您在不影响用户访问的情况下收集验证数据。
report-uri配置
指定违规报告的接收地址。当浏览器检测到PIN不匹配时,会向此地址发送JSON格式的报告。许多安全服务提供商(如Report-URI、CSP等)提供免费的报告接收服务。
配置完成后,点击"模拟验证"按钮,选择不同的验证场景来查看浏览器的响应行为:
| 场景 | 服务器证书 | 浏览器行为 |
|---|---|---|
| 正常验证 | 包含已固定的PIN | 正常加载,绿色提示 |
| 备份PIN验证 | 仅备份PIN匹配 | 加载成功,黄色提示 |
| 伪造证书 | 所有PIN均不匹配 | 阻断连接,红色警告 |
| 首次访问 | 无缓存PIN | 记录PIN,正常加载 |
| 缓存过期 | PIN已过期 | 重新记录PIN |
每个场景的模拟结果都包含详细的浏览器内部处理流程说明,帮助您深入理解HPKP的验证逻辑。
当模拟验证失败时,工具会自动生成一个符合RFC 7469标准的违规报告JSON数据。这个报告通常由浏览器自动发送到配置的report-uri地址。
违规报告包含以下关键信息:
- hostname:发生违规的网站域名
- includeSubDomains:是否启用了子域名包含
- noted-hostname:最初记录PIN值的主机名
- served-certificate-chain:服务器实际提供的证书链
- known-pins:浏览器缓存中已知的PIN值列表
通过分析这些报告,网站管理员可以了解HPKP策略是否正确配置,以及是否存在潜在的安全威胁。在实际生产环境中,建议将这些报告集成到安全监控系统中。
UD5工具箱