HSTS是HTTPS性能和安全优化中最重要的一环,能够给HTTPS带来巨大好处,但也存在一个小缺陷。本篇文章会介绍HSTS的工作原理及如何通过HSTS preload list解决HSTS的小缺陷。
HSTS是HTTP Strict Transport Security的缩写,即:“HTTP严格传输安全”。在介绍HSTS之前,我们先来看HTTPS最典型的用户访问过程。 通常我们访问一个网站时,一般在浏览器中只输入网站地址,而不输入协议名。比如访问野狗的官网,我们最常使用www.wilddog.com,即使该网站是全站HTTPS ,我们也很少使用https://www.wilddog.com 这样的方式。 HTTPS网站的做法是对用户的HTTP访问做 302跳转到HTTPS,并重新建连。
但是这个过程明显存在两个不足之处:
HSTS的出现就是解决这些问题的。HSTS的作用除了节省HTTPS通信RT和强制使用HTTPS ,还包括:
HSTS的工作机制可描述如下:服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在内部做307跳转到HTTPS。而无需任何网络过程。
目前大部分浏览器对HSTS的支持已经相当完美,具体各浏览器和版本的支持情况可以在http://caniuse.com/#search=HSTS上查看。 但是HSTS是有缺陷的,第一次访问网站的客户端,HSTS并不工作。 要解决这个问题,就要了解我们下面要讲解的HSTS preload list。
HSTS preload list是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也会采用这个列表。
加入HSTS preload list不但不麻烦,而且Chrome也鼓励HTTPS网站能够主动加入。申请的方法和需要满足的条件在https://hstspreload.appspot.com网站上都有具体说明。
我将加入HSTS preload list的条件摘录如下:
同时输出的HSTS响应头部需要满足以下条件:
一个典型满足HSTS preload list的响应头部为:add_header Strict-Transport-Security “max-age=31536000; includeSubDomains;preload”;
从申请到审核通过,时间在几天到几周不等。野狗的域名wilddog.com申请总共耗时3天。 申请后,你可以在https://hstspreload.appspot.com网站中查询最新的状态, 也可以在Chrome浏览器的地址框中输入“chrome://net-internals/#hsts”查看。下图是对wilddog.com域名查询的输出结果。
值得一提的是,从审核通过到正式加入到Chrome的stable release版本中还需要一段时间,因为要经过canary、dev、beta以及stable progression。