不要启用 HSTS!

关于是否需要启用 HSTS 的一些探讨, 并给出自己的观点.

Update: 由于增加了在线剪贴板、搜索等服务,有必要保护用户安全,因而本站已经部署 HSTS,这并不影响本文观点的表达及论述。

什么是 HSTS?

HTTP 严格传输安全 (英语: HTTP Strict Transport Security, 缩写: HSTS)是一套由互联网工程任务组发布的互联网安全策略机制. 网站可以选择使用 HSTS 策略, 来让浏览器强制使用 HTTPS 与网站进行通信, 以减少会话劫持风险.

来自维基百科——HTTP 严格传输安全

看样子很棒, 并且在 TLS 证书很容易获得的当下, 似乎为了用户的安全应当部署 HSTS. 但 HSTS 有个问题, 就是:

用户首次访问某网站是不受 HSTS 保护的. 这是因为首次访问时, 浏览器还未收到 HSTS, 所以仍有可能通过明文 HTTP 来访问.

来自维基百科——HTTP 严格传输安全

这怎么办呢? 聪明的浏览器厂商们 (特指 Mozilla 和 Google) 想了个办法, 只要浏览器内置一个域名列表, 列表里包含启用 HSTS 的域名, 那么只要用户访问这些域名, 就会不可逆地跳转至相应 https 页面.

以上所说的那个域名列表, 就是 HSTS 预加载列表.

HSTS 与 HSTS 预加载的最重要区别, 是当用户第一次以 http 方式访问网站时, 仅启用了 HSTS 的网站 (如果没有设置 http 跳转至 https 的话) 仍会以 http 方式访问, 而启用 HSTS 预加载后, 无论网站是否设置跳转, 都会且只能以 https 方式访问.

为了不引起混淆, 我特意另起一段写另外的情景: 启用了 HSTS 后 (无论是否预加载), 只要用户有过对网站的访问 (不是第一次), 浏览器就会记住这个网站启用了 HSTS, 并在未来的一段时间内 (时间长度由网站设置并且在每次访问时都会更新) 只能以 https 方式访问.

所以, 两者唯一的区别在于, HSTS 预加载防止了可能出现的 "第一次访问就被攻击" 情况, 也就是浏览器还没来得及读取网站是否启用了 HSTS 就被攻击了. 换言之, HSTS 预加载是 HSTS 的 "加强版".

为什么不要启用 HSTS?

既然 HSTS 这么好, 为什么不启用它, 甚至是启用预加载呢?

这就提及到一个经典问题: 安全性与便利性的平衡. HSTS 固然强化了安全性, 但也使得用户无法通过 http 方式访问网站. 如果你的 TLS 证书过期, 或者出于一些原因无法提供合法的 https 加密, 那么你的网站就会完全无法访问. 这对任何一个站点来说都是不可接受的.

说到这里, 就提及另外一个问题: 什么样的网站才真正需要 HSTS?

像 Google, Microsoft, Amazon 这种靠云服务吃饭的企业当然需要, 涉及支付的 PayPal, Alipay 当然也需要, 依赖加密通信的 Signal, Telegram, Tutanota 同样需要. 那么一个由个人搭建并维护的博客是否需要呢?

答案当然见仁见智. 但在我看来, 配置一个 http 跳转 https 就足够了, 没必要冒着无法访问的风险过于追求所谓 "安全性".

最后附上 HSTS 预加载提交的网站, MDN 上关于 HSTS 的介绍, 移除 HSTS 预加载的网站, 以及 Firefox 内置的 HSTS 预加载列表.