使用强大的 HSTS 政策

HTTP 等明文协议可能会受到窃听攻击,攻击者能够读取传输的内容。幸运的是,传输层安全协议 (TLS) 可以加密流量,使攻击者在截获此类数据后更难以使用。

不过,攻击者可以通过强制加密连接使用明文 HTTP 来规避 TLS。为了解决此问题,引入了 HTTP 严格传输安全 (HSTS) 响应标头,该标头会强制用户的浏览器仅使用 TLS 访问网站,而不是回退到明文 HTTP(在设定的时间内)。

Lighthouse 审核失败的原因

Lighthouse 审核警告,指出未找到 HSTS 响应标头。
Lighthouse 报告警告,未找到 HSTS 响应标头。

审核将标记 HSTS 标头存在以下问题:

  • 如果未找到任何 HSTS 标头。
  • 缺少其中一个建议的指令 (max-ageincludedSubDomainspreload)
  • 如果 max-age 指令的有效期不足 1 年(31536000 秒)。
  • 如果在解析标头时出现语法错误,例如未知指令。

配置强大的 HSTS 政策

最佳 HSTS 标头配置如下所示:

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
  • max-age 指令用于指定用户浏览器被强制仅使用 TLS 访问网站的时长(以秒为单位)。在此时间过后,如果网站未提供 HSTS 标头(或已设置从 HTTP 到 HTTPS 的临时重定向),则可以再次使用纯 HTTP 访问该网站。
  • 设置 includeSubDomains 指令会在最初发送该标头的网页网址的任何子网域上强制执行该标头。例如,如果 google.com 发送的 HSTS 标头包含 includeSubDomains 指令,则系统也会在 mail.google.com 上强制执行 HSTS 标头。
  • 设置 preload 指令并将网域提交给 HSTS 预加载服务,系统会将该网域编译为使用预加载 HSTS 列表的浏览器二进制文件(而不仅仅是 Google Chrome)。

部署 HSTS 标头时存在一些风险。在 max-age 指令中设置的时间段内,所有需要未加密 HTTP 连接的功能都将无法正常使用。如果应用了 preload 指令,则可能需要更长时间。

为降低发布相关风险,建议采用分阶段方法:

  1. 从较小的 max-age 开始,仅添加 includeSubDomains(不添加 preload):

    max-age=3600; includeSubDomains
    
  2. 在冷却期(例如一周)过后,如果没有报告任何问题,请提高 max-age,例如:

    max-age=604800; includeSubDomains
    
  3. 如果此初始阶段在较长一段时间内(例如三个月)都成功运行,则应将该网站及其子网域添加到 HSTS 预加载列表,并添加 preload 指令。

    max-age=63072000; includeSubDomains; preload