小站前几天通过了HSTS Preload List的审核,目前查询显示为“已预装”,估计再有一阵子就能用在stable上用了吧。


可以在chromium的源码中查询到:https://cs.chromium.org/chromium/src/net/http/transport_security_state_static.json?q=himiku.com&g=0&maxsize=14169872&l=63221

下面让我来水一水为何要加入HSTS Preload List。

封面图:The Teabag Catalogue2#pixiv


HSTS

HSTS的定义

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

HSTS的作用

HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。2

也就是说,我们可以利用这一作用,告知浏览器以后访问这一域名都走HTTPS。即若是访问http,就会通过浏览器直接访问https,而不是靠服务器做301跳转。

HSTS的不足

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

故,就有了浏览器预置HSTS域名列表来解决这个问题。

HSTS Preload List

什么是“HSTS Preload List”

HSTS预加载列表是一个已选择加入HSTS的域名的列表,并且这些域名被强制要求只能通过HTTPS访问。一旦准备就绪,网站管理员就可以将他们的域名提交给hstspreload.org,这将导致他们的域名在Chrome列表中被硬编码为仅限HTTPS。由于所有主流现代浏览器(Chrome,Firefox,Opera,Safari,IE 11和Edge)都有基于Chrome列表的预加载列表,因此可以保护域免受中间人攻击。3

加入HSTS Preload List

加入HSTS Preload List,有以下要求4

  1. 提供有效的SSL证书
  2. 如果正在监听80端口,则需要在同一主机上从HTTP重定向到HTTPS
  3. 所有子域名都需要通过HTTPS传输
  4. 在基本域上为HTTPS请求提供HSTS响应头:

    • 将max-age必须至少31536000秒(1年)。
    • 必须声明includeSubDomains。
    • 必须声明preload。
    • 如果您从HTTPS站点提供其他重定向,则该重定向仍必须具有HSTS响应头(而不是其重定向到的页面)。

申请HSTS的一般步骤

举个例子,这里用我快要过期的域名mikusa.xyz

我用的是LNMP,所以,首先在mikusa.xyz.conf中加入这么一段:

add_header Strict-Transport-Security "max-age=94608000; includeSubDomains; preload" always;

重启Nginx。
随后,前往HSTS预加载列表提交申请。传送门:https://hstspreload.org/


确认无误,迅速按下确定

勾选“我是mikusa.xyz的所有者……”和“我明白这么做的后果……”,迅速提交

这样等我域名过期,买到这个域名的人就不得不用https并且排查好久才知道是HSTS的原因哈哈哈哈……


  1. 维基百科:HTTP严格传输安全
  2. 维基百科「HTTP严格传输安全 」:https://zh.wikipedia.org/wiki/HTTP%E4%B8%A5%E6%A0%BC%E4%BC%A0%E8%BE%93%E5%AE%89%E5%85%A8
  3. Google Open Source对HSTS Preload List的解释:https://opensource.google.com/projects/hstspreload
  4. 来自Google翻译