摘要

  • 网站通过没有传输错误的 HTTPS 连接发出 Strict-Transport-Security 响应头,浏览器记住规则,供后续访问执行。RFC 6797 明确指出:对尚未认识的站点发出的第一次 HTTP 请求,仍有被中间人截获的窗口。
  • Chromium 团队在 2011 年宣布,Gmail 的首次导航也会直接使用 HTTPS。2012 年的 RFC 将浏览器厂商预装 HSTS 名单写成弥补首次访问缺口的一种办法。

规矩写在回信里

Collin Jackson 和 Adam Barth 在 2008 年的 ForceHTTPS 论文中提出,让网站或用户要求浏览器对 HTTPS 更强硬。他们的 Firefox 扩展原型会把非 HTTPS 连接转向 HTTPS,遇到证书错误就终止连接,并阻断不安全的嵌入内容。论文瞄准一个浏览器习惯:为兼容配置不佳的网站,安全错误常被做成可点击跳过的提示。ForceHTTPS 让坚持安全的网站有机会把态度讲清楚。

2012 年的 RFC 6797把要求放进 Strict-Transport-Security 响应头。浏览器在无错误的安全连接上收到它,才会按 max-age 记住站点,并在以后访问时先转向 HTTPS。如果这个头从未加密的 HTTP 连接传来,浏览器必须忽略。否则,占据明文通道的攻击者就能伪造或清除本该防他的规矩。

第一次访问仍站在门外。用户输入域名或点开一个 http 链接时,崭新的浏览器可能还不知道这家网站有 HSTS 政策。RFC 给这种情形起了明确的名字:启动阶段的中间人漏洞。网站的安全指令只能跟着响应回来,而第一次请求已经出门。事后的跳转无法收回它。

名单比请求先到

Chromium 安全团队 2011 年 6 月的公告提供了两种提前知道的办法。Chromium 12 允许高级用户自行指定强制 HTTPS 的域名。对于 Chromium 13,团队称 Gmail 的所有连接都将使用 HTTPS;即使用户只输入 gmail.com 或 mail.google.com,第一次导航也如此。公告还说,这些敏感域名上的证书错误不能靠点击警告继续。浏览器尚未收到 Gmail 的响应,政策已经在本机。

RFC 6797 第 12.3 节描述更一般的预装名单:网站管理员可以请求浏览器厂商把其 HSTS 政策随软件发布。Chromium 的 HSTS 文档说明,新安装或本地状态被清除时仍存在窗口,名单则让选中的域名开箱即受保护。网站负责提供 HTTPS,浏览器厂商决定哪些名字预先进入软件。首次请求的决定权由此分成两段,而关键的前一段掌握在发行浏览器的人手里。

一份 Chromium 13 当年的名单和首次请求流量测量,能说明具体哪些域名和用户得到保护。现有原始记录已经说明机制:响应头管到达之后,预装名单管到达之前。

来源