推出包含 HPKP 报告功能的公钥固定功能

Emily Stark

在网站上使用 SSL 是保护用户安全和隐私的重要方式。 但启用 SSL 并不是大功告成:您可以采取许多措施来进一步增强网站的安全性,例如在 Cookie 上设置 Secure 属性、启用 HTTP 严格传输安全协议,以及使用内容安全政策锁定网站的权限。不过,部署这些强大的功能有时颇为棘手。为了帮助您发布更严格的 SSL,Chrome 46 附带了一项名为 HPKP 报告功能的功能。

所有这些首字母缩略词是什么意思?

如今的网络安全依赖于 SSL 证书:一种用于证明网站身份的加密签名。当浏览器向 https://developers.google.com 等网址发送请求时,服务器会提供 SSL 证书;如果证书有效,浏览器就会允许请求继续进行,并在地址栏中显示一个绿色挂锁图标的网站网址。

那么,什么是有效证书呢?证书必须由证书授权机构 (CA) 或由 CA 签名的另一个证书(称为中间 CA)签名,才会被视为有效。浏览器和操作系统附带数百个经信任可以颁发证书的 CA 的列表。但问题在于,默认情况下,其中任何 CA 都可以为任何网站颁发证书。只要其中任何一个遭到入侵或行为异常,就可能会破坏整个网络。

输入“HTTP Public Key Pinning”(HTTP 公钥固定,简称 HPKP)。此标准允许网站发送 HTTP 标头,以指示浏览器记住(或“固定”)其 SSL 证书链的某些部分。然后,浏览器会拒绝与先前收到的 PIN 码不匹配的后续连接。以下是 HPKP 标头的示例:

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

此标头将两个证书哈希值指定为固定值。一个是网站证书链中证书的哈希值,另一个是备用 PIN 码,或网站在需要轮替证书时可以使用的证书哈希值。标头还包含 max-age 值。该秒数过后,浏览器就会忘记该 PIN 码。

若要从总体上了解 HPKP,请查看规范或 Chrome 开发者 Chris Palmer 的精彩博文

我应该现在就开启 HPKP 吗?

不一定。部署 HPKP 时,很容易出错,不小心为您的网站执行 DoS 攻击。如果您将网站固定到一组证书,然后必须部署一个新证书,那么看到该证书的用户将无法访问您的网站,直到该证书过期(基于标头中的 max-age 值)。

由于处理起来非常困难,因此 HPKP 目前主要由少数知名、安全敏感的网站使用。如果您决定启用 HPKP,则应从非常短的 max-age 值开始,如果没有任何问题,则逐渐增加该值。

什么是 HPKP 报告?有何帮助?

在推出 HPKP 时,您可以使用 HPKP 报告功能(在 Chrome 46 中提供)来检测错误配置。

首先,您可以发送 Public-Key-Pins-Report-Only 标头而不是 Public-Key-Pins 标头:

Public-Key-Pins-Report-Only: 
       max-age=2592000;  
       pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
report-uri="https://example.net/pkp-report"

当您的网站发送此类标头时,Chrome 会验证当前连接是否与 PIN 码相匹配,如果不是,则向 report-uri发送报告。Chrome 绝不会根据“仅限报告”标头中的固定请求来屏蔽请求,因此,这是一种安全的方式,您可以试用 HPKP,看看它是否会给用户带来问题,同时又不会产生将网站 DoS 的风险。

请注意,Report-Only 标头仅适用于接收该标头的请求。浏览器不会像真正的固定一样记住“仅限报告的固定”固定。这样,您就可以测试配置,而无需担心用户浏览器中会缓存不良值;并且您还可以逐步进行发布(例如,仅针对单个资源发布),以免您的服务器被大量报告所占空间。

当您发布实际的 Public-Key-Pins 标头以开始强制执行固定时,您还可以在该标头中添加 report-uri 值,以便在出现任何问题时继续获取报告。

HPKP 违规报告包含哪些内容?

HPKP 违规报告是在 HTTP POST 请求中发送到配置的 report-uri 的 JSON 消息。字段列表可在spec中找到,但在这里我将突出显示其中两个字段:served-certificate-chainvalidated-certificate-chainserved-certificate-chain 就是 Chrome 在为请求设置 SSL 连接时收到的证书。另一方面,validated-certificate-chain 是 Chrome 在尝试验证服务器的证书时重新构建的链,令人惊讶的是,它可能与 served-certificate-chain 不同。不同的客户端以不同的方式执行证书验证,这可能是 HPKP 配置错误的常见原因。如果您收到意外报告,请务必检查此字段。

最后一个“骗局”

如果您要部署 HPKP 报告,请注意 Chrome 会为所有请求(包括报告发送请求)执行固定验证。因此,如果您为网站部署了 HPKP,则可能需要将 HPKP 报告发送到尚未固定的其他网域。否则,您网站上的图钉违规情况会触发向同一网域报告,而且还会无法触发 PIN 码违规,因此您不会收到该报告。

如果您手头没有其他网域,也可以尝试使用 report-uri.io 等服务,该服务会为您处理违规报告。