什么是HSTS,为何要使用它?

image

翻译自: What Is HSTS and Why Should I Use It?

做者:Tomasz Andrzej Nidecki,一位很是专业的 Technical Content Writer ,目前是 Acunetix 的技术内容撰写人,他是一名拥有 25 年 IT 经验的记者、翻译和技术撰稿人,Tomasz 早年曾担任《 hakin9 IT Security 》杂志的总编辑,并曾经运营过一个专门针对电子邮件安全的主要技术博客。html

HSTS 是 HTTP 严格传输安全(HTTP Strict Transport Security) 的缩写。 这是一种网站用来声明他们只能使用安全链接(HTTPS)访问的方法。 若是一个网站声明了 HSTS 策略,浏览器必须拒绝全部的 HTTP 链接并阻止用户接受不安全的 SSL 证书。 目前大多数主流浏览器都支持 HSTS (只有一些移动浏览器没法使用它)。chrome

image

在 2012 年的 RFC 6797 中,HTTP严格传输安全被定义为网络安全标准。 建立这个标准的主要目的,是为了不用户遭受使用 SSL stripping(剥离) 的 中间人攻击(man-in-The-middle,MITM)。 SSL stripping 是一种攻击者强迫浏览器使用 HTTP 协议链接到站点的技术,这样他们就能够嗅探数据包,拦截或修改敏感信息。 另外,HSTS 也是一个很好的保护本身免受 cookie 劫持(cookie hijacking)的方法。浏览器

HSTS 工做原理

一般,当您在 Web 浏览器中输入 URL 时,您会跳过协议部分。 例如,你输入的是 www.acunetix.com,而不是 http://www.acunetix.com。 在这种状况下,浏览器假设你想使用 HTTP 协议,因此它在这个阶段发出一个 HTTP 请求www.acunetix.com,同时,Web Server 会返回 301 状态码将请求重定向到 HTTPS 站点。 接下来浏览器使用 HTTPS 链接到 www.acunetix.com。 这时 HSTS 安全策略保护开始使用 HTTP 响应头:缓存

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

响应头的 Strict-Transport-Security 给浏览器提供了详细的说明。 从如今开始,每一个链接到该网站及其子域的下一年(31536000秒)从这个头被接收的时刻起必须是一个 HTTPS 链接。 HTTP 链接是彻底不容许的。 若是浏览器接收到使用 HTTP 加载资源的请求,则必须尝试使用 HTTPS 请求替代。 若是 HTTPS 不可用,则必须直接终止链接安全

此外,若是证书无效,将阻止你创建链接。 一般来讲,若是 HTTPS 证书无效(如:过时、自签名、由未知 CA 签名等),浏览器会显示一个能够规避的警告。 可是,若是站点有 HSTS,浏览器就不会让你绕过警告。 若要访问该站点,必须从浏览器内的 HSTS 列表中删除该站点cookie

响应头的 Strict-Transport-Security 是针对一个特定的网站发送的,而且覆盖一个特定的域名(domain)。 所以,若是你有 HSTS 的 www.acunetix.com ,它不会覆盖 acunetix. com,而只覆盖 www 子域名。 这就是为何,为了彻底的保护,你的网站应该包含一个对 base domain 的调用(在本例中是 acunetix. com) ,而且接收该域名的 Strict-Transport-Security 头和 includeSubDomains 指令。网络

image

HSTS 是否彻底安全?

不幸的是,你第一次访问这个网站,你不受 HSTS 的保护。 若是网站向 HTTP 链接添加 HSTS 头,则该报头将被忽略。 这是由于攻击者能够在中间人攻击(man-in-the-middle attack)中删除或添加头部。 HSTS 报头不可信,除非它是经过 HTTPS 传递的。dom

你还应该知道,每次您的浏览器读取 header 时,HSTS max-age 都会刷新,最大值为两年。 这意味着保护是永久性的,只要两次访问之间不超过两年。 若是你两年没有访问一个网站,它会被视为一个新网站。 与此同时,若是你提供 max-age 0 的 HSTS header,浏览器将在下一次链接尝试时将该站点视为一个新站点(这对测试很是有用)。ide

你可使用称为 HSTS 预加载列表(HSTS preload list)的附加保护方法。 Chromium 项目维护一个使用 HSTS 的网站列表,该列表经过浏览器发布。 若是你把你的网站添加到预加载列表中,浏览器会首先检查内部列表,这样你的网站就永远不会经过 HTTP 访问,甚至在第一次链接尝试时也不会。 这个方法不是 HSTS 标准的一部分,可是它被全部主流浏览器(Chrome、 Firefox、 Safari、 Opera、 IE11 和 Edge)使用。测试

目前惟一可用于绕过 HSTS 的已知方法是基于 NTP 的攻击。 若是客户端计算机容易受到 NTP 攻击( NTP-based attack),它可能会被欺骗,使 HSTS 策略到期,并使用 HTTP 访问站点一次。

如何将域名添加到 HSTS 预加载列表?

要将域添加到 HSTS 预加载列表,该域的站点必须知足几个要求。 如下是添加域名所需的步骤:

  1. 确保你的网站拥有有效的证书和最新的密码
  2. 若是你的网站能够经过 HTTP 访问,请将全部请求重定向到 HTTPS
  3. 确保以上第 1 点和第 2 点适用于你的全部域名和子域名(根据您的 DNS 记录)
  4. 经过 HTTPS 服务返回 Strict-Transport-Security header ,带上 base domainmax-agemax-age 至少为31536000 (1 年),另外还有 includeSubDomains 指令和 preload 指令。 能够参考上面的 HSTS header。
  5. 访问 hstspreload.org ,并使用表格提交你的域名。若是符合条件,您的域名将被加入队列。

为了提升安全性,浏览器不能访问或下载 预加载列表(preload list)。 它做为硬编码资源(hard-coded resource)和新的浏览器版本一块儿分发。 这意味着结果出如今列表中须要至关长的时间,而域从列表中删除也须要至关长的时间。 若是你但愿将你的站点添加到列表中,则必须确保您可以在较长时间内保持对全部资源的彻底 HTTPS 访问。 若是不这样作,你的网站可能会彻底没法访问

就像这样:
image

如何从浏览器的 HSTS 缓存中删除域?

在设置 HSTS 并测试它时,可能须要清除浏览器中的 HSTS 缓存。 若是你设置 HSTS 不正确,你可能会访问网站出错,除非你清除数据。 下面是几种经常使用浏览器的方法。 还要注意,若是你的域在 HSTS 预加载列表中,清除 HSTS 缓存将是无效的,而且没法强制进行 HTTP 链接。

要从 Chrome HSTS 缓存中删除一个域名,请按照如下步骤操做:

  1. 访问 chrome://net-internals/#hsts
  2. Delete domain security policies下的文本框中输入要删除的域
  3. 点击文本框旁边的 Delete 按钮

image

以后,你能够检查移除是否成功:

  1. Query HSTS/PKP domain 下的文本框中输入要验证的域
  2. 点击文本框旁边的 Query 按钮
  3. 返回应该是 not found

image

Mozilla Firefox 、Safari 和 Microsoft Edge 自行查看原文吧。