解决缺陷,让HSTS变得完美

LinStanley 8年前

来自: https://blog.wilddog.com/?p=997

HSTS是HTTPS性能和安全优化中最重要的一环,能够给HTTPS带来巨大好处,但也存在一个小缺陷。本篇文章会介绍HSTS的工作原理及如何通过HSTS preload list解决HSTS的小缺陷。

HSTS是什么?

HSTS是HTTP Strict Transport Security的缩写,即:“HTTP严格传输安全”。在介绍HSTS之前,我们先来看HTTPS最典型的用户访问过程。 通常我们访问一个网站时,一般在浏览器中只输入网站地址,而不输入协议名。比如访问野狗的官网,我们最常使用www.wilddog.com,即使该网站是全站HTTPS ,我们也很少使用https://www.wilddog.com 这样的方式。 HTTPS网站的做法是对用户的HTTP访问做 302跳转到HTTPS,并重新建连。

但是这个过程明显存在两个不足之处:

  • 整个通信过程中的前两个RT是没有意义的;
  • 使用了不安全的HTTP通信,万一你是在提交敏感数据呢。

HSTS的出现就是解决这些问题的。HSTS的作用除了节省HTTPS通信RT和强制使用HTTPS ,还包括:

  • 阻止基于SSLStrip的中间人攻击;
  • 万一证书有错误,则显示错误,用户不能回避警告。

HSTS的工作机制可描述如下:服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在内部做307跳转到HTTPS。而无需任何网络过程。

目前大部分浏览器对HSTS的支持已经相当完美,具体各浏览器和版本的支持情况可以在http://caniuse.com/#search=HSTS上查看。 但是HSTS是有缺陷的,第一次访问网站的客户端,HSTS并不工作。 要解决这个问题,就要了解我们下面要讲解的HSTS preload list。

HSTS preload list

HSTS preload list是什么?

HSTS preload list是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也会采用这个列表。

如何加入HSTS preload list?

加入HSTS preload list不但不麻烦,而且Chrome也鼓励HTTPS网站能够主动加入。申请的方法和需要满足的条件在https://hstspreload.appspot.com网站上都有具体说明。

我将加入HSTS preload list的条件摘录如下:

  • 有效的证书(如果使用SHA-1证书,必须是2016年前就会过期的);
  • 将所有HTTP流量重定向到HTTPS;
  • 确保所有子域名启用HTTPS,特别是www子域名

同时输出的HSTS响应头部需要满足以下条件:

  • max-age至少需要18周,10886400秒
  • 必须指定includeSubdomains参数
  • 必须支持preload参数

一个典型满足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。