在网站上使用 SSL 是保护用户安全和隐私的重要方式。 不过,启用 SSL 只是第一步:您还可以采取许多措施来进一步增强网站的安全性,例如在 Cookie 上设置 Secure 属性、启用 HTTP 严格传输安全协议,以及使用内容安全政策来锁定网站的权限。不过,部署这些强大的功能有时可能会很棘手。为了帮助您推出更严格的 SSL 形式,Chrome 46 附带了一项名为 HPKP 报告的功能。
这些首字母缩写词分别代表什么含义?
当今的网络安全依赖于 SSL 证书:证明网站身份的加密签名。当您的浏览器向网址(例如 https://developers.google.com)发送请求时,服务器会提供 SSL 证书,如果证书有效,浏览器会允许请求继续,并在地址栏中显示带有绿色挂锁的网站网址。
不过,什么是有效证书?证书必须由证书授权机构 (CA) 或由 CA 签署的其他证书(称为中间 CA)签署,才会被视为有效。浏览器和操作系统附带一个包含数百个受信任 CA 的列表,这些 CA 负责颁发证书。 不过,问题在于,默认情况下,这些 CA 中的任何一个都可以为任何网站颁发证书。如果其中任何一个遭到入侵或行为不当,都可能对整个网络造成毁灭性影响。
输入 HTTP 公钥固定 (HPKP)。该标准允许网站发送 HTTP 标头,指示浏览器记住(或“固定”)其 SSL 证书链的某些部分。然后,浏览器会拒绝与之前收到的固定信息不匹配的后续连接。以下是 HPKP 标头的示例:
Public-Key-Pins:
pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
max-age=259200
此标头指定了两个证书哈希作为固定。一个是网站证书链中某个证书的哈希,另一个是备用固定证书,即网站在需要轮替证书时可以使用的证书的哈希。该标头还包含 max-age 值。经过该秒数后,浏览器将忘记该固定。
如需详细了解 HPKP,请参阅规范或 Chrome 开发者 Chris Palmer 的精彩博文。
我应该立即启用 HPKP 吗?
不一定。部署 HPKP 时,很容易出错并意外导致网站遭受 DoS 攻击。如果您将网站固定到一组证书,然后又必须部署新证书,那么在固定到期(基于标头中的 max-age 值)之前,已看到固定证书的用户将无法访问您的网站。
由于 HPKP 很难正确实施,因此目前主要由少数备受瞩目、对安全性敏感的网站使用。如果您决定启用 HPKP,应先设置一个非常短的 max-age 值,然后在没有出现任何问题的情况下逐渐增加该值。
什么是 HPKP 报告?它有何作用?
HPKP 报告功能在 Chrome 46 中推出,可用于在部署 HPKP 时检测配置错误。
首先,您可以先发送 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 会验证当前连接是否与固定证书匹配,如果不匹配,则会向 report-uri 发送报告。Chrome 绝不会根据 Report-Only 标头中的固定信息阻止请求,因此,这是一种安全的方法,可用于试用 HPKP 并查看它是否会给用户带来问题,而不会造成网站拒绝服务的风险。
请注意,Report-Only 标头仅适用于收到该标头的请求。浏览器不会像记住真实固定证书那样记住仅报告固定证书。这样,您就可以测试配置,而不必担心在用户的浏览器中缓存错误的值,并且可以逐步发布(例如,仅在单个资源上发布),以避免服务器收到大量报告。
当您发布实际的 Public-Key-Pins 标头以开始强制执行固定时,您也可以在该标头中添加 report-uri 值,以便在出现任何问题时继续收到报告。
HPKP 违规报告中包含哪些内容?
HPKP 违规报告是一条 JSON 消息,通过 HTTP POST 请求发送到您配置的 report-uri。您可以在规范中找到字段列表,但我在这里重点介绍其中两个字段:served-certificate-chain 和 validated-certificate-chain。served-certificate-chain 是 Chrome 在为请求设置 SSL 连接时收到的确切证书。另一方面,validated-certificate-chain 是 Chrome 在尝试验证服务器证书时重建的链,令人惊讶的是,它可能与 served-certificate-chain 不同。不同的客户端会以不同的方式执行证书验证,这可能是导致 HPKP 配置错误的常见原因。如果您收到意外报告,请务必检查此字段。
最后一个“陷阱”
如果您要部署 HPKP 报告,请注意,Chrome 会对所有请求(包括报告发送请求)进行固定验证。因此,如果您为网站部署了 HPKP,则可能需要将 HPKP 报告发送到您尚未固定的其他网域。否则,您网站上的固定违规行为将触发向同一网域发送报告,该网域也会固定违规,因此您不会收到报告。
如果您没有其他网域,可以尝试使用 report-uri.io 等服务,这些服务会为您处理违规报告。