网络安全 – 折腾(存档) https://blog.sorz.org 已停止更新和维护。该页面为2018年3月创建的存档,其内容可能已过于陈旧、与现状不符,仅作为历史存档用作参考。 Sun, 14 Jan 2018 11:08:20 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.9.4 HSTS Preloading – 让你的域名「嵌入」主流浏览器,一同发行 /p/hsts-preload-list/ /p/hsts-preload-list/#comments Thu, 19 Mar 2015 19:39:59 +0000 /?p=348035 有点标题党的味道,但确实有这种效果,比如我现在用的这个域名sorz.org目前可以在 ChromiumFirefox 的源代码中找到。理论上,它也会出现在 Safari 和新版的 IE 里[1]

当然「听起来好像很厉害」只是个副作用,其目的还是为了确保安全。

TL;DR – 如果你的网站也支持全站 HTTPS,可以考虑配妥 HSTS 后在此提交申请

(2015-11 更新)现在 Qualys 的 SSL Server Test 也会显示相关信息啦:
ssllabs-result-with-hsts

一切为了安全

现代浏览器在安全上真是做足了功夫。

HTTPS

SSL 协议在早在上世纪末就已提出[2]。目前广泛使用的 TLS 1.2 是它的改良版,在 2008 年正式发布[3]。他们可以在很大程度上,保证数据在 浏览器 与 网站服务器 间传输时的安全,保证他们不在传输过程中被监听或者修改。

但目前仍有大量网站是不提供 HTTPS (SSL/TLS)连接的 [4],或是只在部分页面提供。浏览器不知道哪些网站使用 HTTPS,用户也不一定知道。现在通常的做法是,浏览器先默认使用 HTTP 连接,如果服务器要求安全连接,再通过这个 HTTP 连接返回给浏览器一个「重定向」,让浏览器转而使用 HTTPS。

这样有一个问题,因为 HTTP 是不安全的,这个「重定向」就有可能被攻击者吞掉。然后攻击者一方面冒充服务器,使用 HTTP 与浏览器进行通讯;另一方面冒充浏览器,与服务器使用 HTTPS 建立连接。这就是所谓的 SSLstrip 攻击。

HSTS

为了解决这个问题,HTTP Strict Transport Security (HSTS, HTTP 严格传输安全) 孕育而出。这个 2012 年才发布的新玩意儿其实很简单,就是制订了一种方法,让服务器能够告诉浏览器:「我支持 HTTPS,今后使用它连接我」。

具体来说,它在增加了一个 HTTP 头 Strict-Transport-Security,里面指明网站至少支持 HTTPS 多长时间、是否包含子域名等。浏览器会缓存这条规则,今后即使是用户或者网页指定了http://,浏览器也会无视掉它,强制使用安全连接。

Preload List

但这无法阻止首次访问网站时受攻击(此时还没有 HSTS 规则的缓存呢),浏览器们并不满足于此,推出了 HSTS Prelod List(预加载列表?)。顾名思义,就是将使用 HSTS 的网站域名直接内置(hard-coded)进浏览器。只要是出现在列表中的域名,就统统使用 HTTPS 连接,让攻击者无缝可钻,安全性大提升。

部署

唔.. 介绍了这么多背景,进入正题,怎么做?首先当然是要做好全站的 HTTPS 支持,这个就略过不提了。然后是部署 HSTS。最后是提交申请,进入浏览器的 Preload List。

UPDATE 20150904: 如果你在使用 CloudFlare,进入 Dashborad,在 Crypto 找到并开启 HSTS 就可以了。

HSTS

添加 HSTS 支持其实很简单,修改一下 Web 服务器的配置,增加一个 HTTP 头就行[5]。随手 Google 到了一篇文章,大家可以参考一下。

举个例子,这个域名目前使用的是:

Strict-Transport-Security: max-age=15552000; includeSubDomains; preload

max-age=15552000告诉浏览器缓存这条规则 180 天;includeSubDomains对子域名也使用相同的规则;preload允许将这条规则内置进浏览器。

部署完毕后,可以用这个网站测试一下。如果存在其他安全相关问题,也会被检测出来。

Preload List

Duang! 现在可以提交申请啦(自备梯子):
https://hstspreload.appspot.com/

这个网站似乎是 Google 牵头做的,但不仅 Chrome,Firefox、Safari 和 IE 也都会包含这个列表。所以只要在这里提交一次就行啦。

提交前注意几点:

  • 需在全站启用 HTTPS(包括子域名),同时重定向所有 HTTP 流量至 HTTPS;
  • max-age必须大于 10886400 秒(18 周);
  • includeSubdomainspreload
  • 不能反悔的哦。

另外,他说这个申请是要经过人工审核的(not automatic nor assured … undergo a manual review),所以可能要花上几周的时间。具体到并入个浏览器代码中,可能需要更长的时间。

老实说,当初我看见「人工审核」便没报太大希望,提交后就忘了这事了。近几天才偶然发现已经申请通过并入了浏览器,才知道其实并没有什么门槛(虽然目前的列表只有两千行左右)。所以我也不知道我从申请到通过花了多久…

附注

[1] 会并入随 Windows 10 发布的那个 IE 上,MSDN 是这样说的。所以我是不是还可以更标题党一点,比如「与 Windows 一同发布」或者「嵌入 Windows」,233。
[2] Wikipedia – Transport Layer Security
[3] RFC 5246 The Transport Layer Security (TLS) Version 1.2
[4] 65% of top 1,000,000 websites by 2014. Source.
[5] 其实要完全符合标准的话,还要复杂一些。如果你也在使用 nginx,可以参考这条评论进行设置,会更规范一些。

]]>
/p/hsts-preload-list/feed/ 34