无需登录 数据私有 本地保存

HTTP公钥固定(HPKP)模拟演示 - 证书管理

10
0
0
0

HTTP 公钥固定 (HPKP) 模拟演示

深入了解 HPKP 机制 —— 生成密钥对、计算 PIN 哈希、构建 Public-Key-Pins 响应头, 并通过交互式模拟理解浏览器证书验证流程与安全风险。

已废弃技术 教育演示 Web Crypto API
主密钥 & 主 PIN Primary Pin

当前服务器证书的公钥 —— 必须固定。

尚未生成
等待生成...
备份密钥 & 备份 PIN Backup Pin

离线安全存储的备用公钥 —— 防止意外锁定。

尚未生成
等待生成...
中间CA密钥(可选) CA Pin

Pin 中间CA公钥可允许证书轮换而不触发HPKP错误。

尚未生成
等待生成...

自动生成主密钥、备份密钥和CA密钥,并计算所有PIN。

HPKP Header 配置
生成的 HTTP 响应头
请先生成至少两个密钥对(主密钥 + 备份密钥)...
浏览器验证模拟

模拟浏览器访问配置了HPKP的网站时的证书验证过程。

1 2 3 4
步骤1:浏览器收到服务器证书
场景A:正常证书

服务器使用与主PIN匹配的证书

场景B:备份证书

服务器使用与备份PIN匹配的证书

场景C:伪造证书(MITM)

攻击者使用不匹配任何PIN的证书

违规报告预览(report-uri)
HPKP 自杀(Ransom Attack)

如果所有被Pin的公钥对应的私钥全部丢失(如服务器被入侵、备份密钥损坏),网站将永久无法被已缓存HPKP的浏览器访问,直到max-age过期。这是HPKP最致命的风险,也是其被废弃的主要原因之一。

现代替代方案:证书透明度(CT)

HPKP已于2017年被Chrome废弃,2018年移除。现代Web安全依赖证书透明度(Certificate Transparency)Expect-CT头来检测恶意证书,更安全且不会造成不可逆的锁定。

常见问题与知识点(FAQ)

HTTP公钥固定(HTTP Public Key Pinning,HPKP)是一种Web安全机制,通过Public-Key-Pins HTTP响应头告诉浏览器:在指定时间内(max-age),只接受与预定义公钥哈希值(PIN)匹配的证书。如果服务器提供的证书公钥与任何已声明的PIN都不匹配,浏览器将拒绝连接,从而防止中间人攻击和 rogue CA 颁发的伪造证书。

HPKP由IETF在RFC 7469中定义,但由于配置风险极高(可能导致网站永久不可访问),已于2017-2018年被主流浏览器废弃。

HPKP被废弃的主要原因包括:

  • HPKP自杀风险:配置错误(如丢失所有备份私钥、错误pin了不存在的公钥)会导致网站永久无法访问,且没有任何恢复手段。
  • Ransom攻击:攻击者如果获得服务器访问权限,可以故意设置恶意HPKP头并索要赎金。
  • 复杂度高:正确配置HPKP需要深入理解PKI和证书链,普通管理员容易出错。
  • 证书透明度(CT)的普及:CT提供了更安全的替代方案,通过公开日志监控证书颁发,能在不锁定网站的情况下检测恶意证书。
  • 低采用率:由于风险太高,实际部署HPKP的网站极少。

pin-sha256的计算步骤如下:

  1. 从证书中提取Subject Public Key Info (SPKI) —— DER编码的公钥信息块。
  2. 对SPKI的DER字节进行SHA-256哈希计算,得到32字节的摘要。
  3. 将摘要进行Base64编码,得到44字符的PIN值。

在本工具中,我们使用Web Crypto API真实地执行了以上所有步骤:生成密钥对 → 导出SPKI(DER格式)→ SHA-256 → Base64。

命令行方式(使用OpenSSL):

openssl x509 -in certificate.pem -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

HPKP规范强制要求至少声明两个PIN

  • 主PIN:当前在用证书链中某个证书的公钥哈希。
  • 备份PIN:另一个完全独立的密钥对的公钥哈希(私钥离线安全存储)。

备份PIN的作用是灾难恢复:如果主密钥的私钥泄露或丢失,可以使用备份密钥申请新证书,从而恢复网站访问。如果没有备份PIN且主密钥不可用,网站将进入"HPKP自杀"状态。

最佳实践建议备份PIN使用不同CA签发的证书的公钥,以防范单个CA出现问题。

HPKP可以pin证书链中任意层级的公钥:

  • 叶子证书(End-entity):最严格。每次证书更新都必须更新HPKP头,容易出错。不推荐。
  • 中间CA证书:推荐。只要中间CA的公钥不变,该CA签发的任何证书都有效。允许平滑轮换叶子证书。
  • 根CA证书:较宽松。但如果根CA更换密钥(极少发生),所有被pin的网站都会出问题。

最佳实践是Pin中间CA的公钥,同时备份pin另一个不同CA的中间证书公钥。

max-age决定了浏览器缓存HPKP策略的时长(秒):

  • 测试阶段:60-600秒(1-10分钟),使用Report-Only模式,观察是否有误报。
  • 谨慎生产:86400-604800秒(1-7天),确认配置无误后逐步增加。
  • 正式生产:5184000秒(60天)是常见选择。最长可设约2年。

重要:max-age越长,配置错误的影响越大!在max-age过期前,被错误锁定的用户无法访问网站。建议从较短时间开始,确认无误后再延长。

Public-Key-Pins-Report-Only(Report-Only模式):浏览器仅检查PIN匹配情况并发送报告,但不会阻止连接。用于部署前测试。

report-uri:指定一个URL,当浏览器检测到PIN不匹配时,会向该URL发送JSON格式的违规报告。报告包含:

  • 违规发生的时间
  • 主机名和端口
  • 服务器实际提供的证书链
  • 已知的PIN列表

建议部署流程:先使用Report-Only模式 + report-uri收集数据 → 分析确认配置正确 → 再启用强制模式。

两者都是通过HTTP响应头增强安全性的机制,但作用不同:

  • HSTS(HTTP Strict Transport Security):强制浏览器使用HTTPS连接,防止SSL剥离攻击。只关注是否使用TLS
  • HPKP:限制浏览器只接受特定公钥的证书,防止使用伪造证书的中间人攻击。关注使用哪个证书

HSTS目前仍被广泛使用和推荐;HPKP已被废弃。两者可以配合使用,但HPKP的风险远高于HSTS。

证书透明度(Certificate Transparency,CT)是一个开放的框架,用于监控和审计证书颁发:

  • CA在颁发证书时必须将证书提交到公开的CT日志中。
  • 浏览器可以检查证书是否已记录在CT日志中。
  • 域名所有者可以监控CT日志,发现未经授权的证书颁发。

与HPKP相比,CT的优势:

  • 不会锁定网站 —— 不存在"自杀"风险。
  • 恶意证书可以被检测到而不是被阻止(更灵活)。
  • Expect-CT头可要求浏览器强制验证CT日志。
  • 已成为Chrome、Safari等浏览器的强制要求。

includeSubDomains指令将HPKP策略应用到所有子域名。风险包括:

  • 如果某个子域名使用不同的证书(来自不同CA),且其公钥不在PIN列表中,该子域名将无法访问
  • CDN或其他第三方服务的子域名可能不受你控制,其证书更换会导致问题。
  • 扩大HPKP自杀的影响范围 —— 主域名和所有子域名全部锁定。

建议:除非你完全控制所有子域名的证书管理,否则不要启用includeSubDomains,或仅在充分测试后启用。