在您的网站上使用 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
此标头将两个证书哈希指定为固定值。其中一个是网站证书链中的证书的哈希值,另一个是备用 PIN 码,或网站在需要轮替证书时可使用的证书的哈希值。该标头还包含 max-age
值。相应秒数过后,浏览器会忘记该 PIN 码。
如需详细了解 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 绝不会根据“仅报告”标头中的固定值屏蔽请求,因此,这是试用 HPKP 的安全方式,可让您了解 HPKP 是否会给用户带来问题,而不会冒网站遭到 DoS 攻击的风险。
请注意,“仅报告”标头仅适用于收到该标头的请求。浏览器不会像对待真实的固定的网页一样记住“仅报告”固定的网页。这样,您就可以测试配置,而不必担心在用户的浏览器中缓存错误值,并且可以逐步发布(例如,仅在单个资源上发布),以免报告泛滥导致服务器过载。
在发布真实的 Public-Key-Pins
标头以开始强制执行固定的网址时,您还可以在该标头中添加 report-uri 值,以便在出现任何问题时继续接收报告。
HPKP 违规报告中包含哪些内容?
HPKP 违规报告是指通过 HTTP POST 请求发送到您配置的 report-uri
的 JSON 消息。您可以在规范中找到字段列表,但我在这里重点介绍其中的两个字段:served-certificate-chain
和 validated-certificate-chain
。served-certificate-chain
是 Chrome 在为请求设置 SSL 连接时收到的证书。另一方面,validated-certificate-chain
是 Chrome 在尝试验证服务器证书时重新构建的链,令人惊讶的是,它可能与 served-certificate-chain
不同。不同的客户端会以不同的方式执行证书验证,这可能是 HPKP 配置错误的常见原因。如果您收到意外报告,请务必检查此字段。
最后一个“陷阱”
如果您要部署 HPKP 报告,请注意,Chrome 会对所有请求(包括发送报告的请求)进行 PIN 验证。因此,如果您已为自己的网站部署 HPKP,则可能需要将 HPKP 报告发送到您尚未固定的其他网域。否则,如果您的网站存在引脚违规问题,系统会针对同一网域触发报告,该报告也会因引脚违规而失败,因此您不会收到报告。
如果您没有其他可用的网域,可以改为尝试使用 report-uri.io 等服务,由其代您处理违规报告。