什么是 HSTS
大家可以参考我之前写的博文,里面有对 HSTS 的简介
一点小小的不足
以我的网站为例,我来讲讲不足的地方。
假设一个用户从来没有访问过我的网站,并且他第一次访问的时候访问的是 http://imlonghao.com
,在正常的情况下,我的服务器就会给这位用户返回一个 301 跳转到 https://imlonghao.com
,并且带上 HSTS 头
在用户下次访问我的博客时,只要 HSTS 还在有效期中,浏览器就会直接响应一个 HTTP 307
头,并跳转到相对应的 https
页面,并且这是不需要经过数据传输的,直接在本地浏览器进行的处理
这似乎没什么问题,对吧。
但是,当他第一次访问的时候就可能有问题了,由于是 http
协议进行的数据传输,因此这里就可能被别人进行链路挟持了,他就可以改掉你的 HSTS 规则,然后给你直接挟持到他们指定的网站上去,那么用户可能就无法正常访问到我的博客了。
于是乎,HSTS Preload List 似乎就是一种机制来解决这个问题
HSTS Preload List
简介
(我就直接翻译官方的原话吧)
HSTS Preload List 是一个站点的列表,他将会被通过硬编码写入 Chrome 浏览器中,列表中的站点将会默认使用 HTTPS
进行访问,此外,Firefox 、Safari 、IE 11 和 Edge 也同样一份 HSTS 站点列表,其中包括了 Chrome 的列表
申请要求
Expiry must be at least eighteen weeks (10886400 seconds). The includeSubdomains token must be specified. The preload token must be specified. If you are serving an additional redirect from your HTTPS site, that redirect must still have the HSTS header (not the page it redirects to).
- 有一张有效的证书(如果是使用了
SHA-1
证书签名算法的必须在 2016 年前失效) - 重定向所有的 HTTP 流量到 HTTPS ( HTTPS ONLY )
- 全部子域名的流量均通过 HTTPS ,如果子域名的
www
存在的话也同样需要通过 HTTPS 传输。例如我的子域名是subdomain.imlonghao.com
,并且www.subdomain.imlonghao.com
也存在,所以www.subdomain.imlonghao.com
也需要通过 HTTPS 传输 - 在相应的域名中输出 HSTS 响应头
- 过期时间至少大于 18 周(10886400 秒)
- 必须声明
includeSubdomains
- 必须声明
preload
- 跳转过去的那个页面也需要有
HSTS
头,应该指的是http://imlonghao.com
一个例子:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
开始申请
很简单,我们需要打开这个页面,HSTS Preload Submission
然后输入你的域名按 ENTER
然后就会提示你你的域名已经在等待审核了,预计有几个星期甚至是一个多月才可以审核通过
查看结果
如果你的域名已经通过审核的话,页面会是这样的
而且这个时候在 chromium 的源代码中是可以找的到你的域名的了
一点好玩的想法
如果我的域名在这个列表里面,并且大多数浏览器都已经更新到新的列表,那么我就可以去用国内的 VPS 之类的,不打开 80 端口,只打开 443 ,浏览器同样会跳转过来,这样就可以免备案了~
- 不过似乎这样对搜索引擎不太友好~
:)
Update in 2016.1.10 23:50
本站已经成功加入 HSTS Preload List ,预计几个月之后就可以进 stable 了!
并且,十分幸运的是,和一个我挺喜欢的博客 (imququ.com) 并排