分类 标签 存档 黑客派 订阅 搜索

如何配置使用 HSTS

104 浏览

HTTP 严格传输安全(英语:HTTP Strict Transport Security,缩写:HSTS)是一套由互联网工程任务组发布的互联网安全策略机制。网站可以选择使用 HSTS 策略,来让浏览器强制使用 HTTPS 与网站进行通信,以减少会话劫持风险.

内容

HSTS 的作用是强制客户端(如浏览器)使用 HTTPS 与服务器创建连接。服务器开启 HSTS 的方法是,当客户端通过 HTTPS 发出请求时,在服务器返回的超文本传输协议响应头中包含 Strict-Transport-Security 字段。非加密传输时设置的 HSTS 字段无效。

比如,https://example.com/ 的响应头含有 Strict-Transport-Security: max-age=31536000; includeSubDomains。这意味着两点:

  1. 在接下来的一年(即 31536000 秒)中,浏览器只要向 example.com 或其子域名发送 HTTP 请求时,必须采用 HTTPS 来发起连接。比如,用户点击超链接或在地址栏输入http://www.example.com/ ,浏览器应当自动将 http 转写成 https,然后直接向 https://www.example.com/ 发送请求。
  2. 在接下来的一年中,如果 example.com 服务器发送的 TLS 证书无效,用户不能忽略浏览器警告继续访问网站.

历史

HSTS 的雏形来自于 2008 年 4 月在北京召开的第十七届国际万维网大会上柯林 · 杰克逊(Collin Jackson)和亚当 · 巴斯(Adam Barth)的题为 “ForceHTTPS: Protecting High-Security Web Sites from Network Attacks” 的演讲。他们的提议是使用“ForceHTTPS” Cookie 来强制浏览器使用 HTTPS。

2009 年 9 月 18 日,他们和杰夫 · 霍奇斯(Jeff Hodges)发布了最初的草案,题目为 "Strict Transport Security"[5],这个草案基于 ForceHTTPS,并有所修改。

2010 年 6 月 17 日,这三位作者经由互联网工程任务组发布了首版互联网草案,"HTTP Strict Transport Security"。

2012 年 10 月 2 日,互联网工程指导组批准了将第 14 版 HSTS 草案发布为 RFC 的请求。

2012 年 11 月 19 日,互联网工程任务组发布 RFC 6797

作用

HSTS 可以用来抵御 SSL 剥离攻击。SSL 剥离攻击是中间人攻击的一种,由 Moxie Marlinspike 于 2009 年发明。他在当年的黑帽大会上发表的题为 “New Tricks For Defeating SSL In Practice” 的演讲中将这种攻击方式公开。SSL 剥离的实施方法是阻止浏览器与服务器创建 HTTPS 连接。它的前提是用户很少直接在地址栏输入 https:// ,用户总是通过点击链接或 3xx 重定向,从 HTTP 页面进入 HTTPS 页面。所以攻击者可以在用户访问 HTTP 页面时替换所有 https:// 开头的链接为 http:// ,达到阻止 HTTPS 的目的.

HSTS 可以很大程度上解决 SSL 剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用 HTTPS,即使链接被换成了 HTTP。

另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告。HSTS 解决了这一问题,一旦服务器发送了 HSTS 字段,用户将不再允许忽略警告。

不足

用户首次访问某网站是不受 HSTS 保护的。这是因为首次访问时,浏览器还未收到 HSTS,所以仍有可能通过明文 HTTP 来访问。解决这个不足目前有两种方案,一是浏览器预置 HSTS 域名列表,Google Chrome、Firefox、Internet Explorer 和 Microsoft Edge 实现了这一方案。二是将 HSTS 信息加入到域名系统记录中。但这需要保证 DNS 的安全性,也就是需要部署域名系统安全扩展。截至 2014 年这一方案没有大规模部署。

由于 HSTS 会在一定时间后失效(有效期由 max-age 指定),所以浏览器是否强制 HSTS 策略取决于当前系统时间。部分操作系统经常通过网络时间协议更新系统时间,如 Ubuntu 每次连接网络时,OS X Lion 每隔 9 分钟会自动连接时间服务器。攻击者可以通过伪造 NTP 信息,设置错误时间来绕过 HSTS。解决方法是认证 NTP 信息,或者禁止 NTP 大幅度增减时间。比如 Windows 8 每 7 天更新一次时间,并且要求每次 NTP 设置的时间与当前时间不得超过 15 小时。

浏览器支持

  • Chromium 和 Google Chrome 从 4.0.211.0 版本开始支持 HSTS
  • Firefox 4 及以上版本
  • Opera 12 及以上版本
  • Safari 从 OS X Mavericks 起
  • Internet Explorer 从 Windows 10 技术预览版开始支持

网站支持

根据 SSL Pulse 的调查,截至 2015 年 2 月,仅有 2.7% 的网站开启了 HSTS。目前支持 HSTS 的主流网站有:支付宝、PayPal、Twitter、维基百科邮件列表、上善若水等。

以上内容来自维基百科, 维基百科真是个好网站.

配置

啰嗦了这么多, 其实就是为了凑字数. Nginx 配置在 ssl.conf 文件中的 server 字段下添加如下代码:

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";//第二个跟第三个参数一般来说没用,支付宝的首页就只用了第一个参数.所以添加下面一行配置就行
add_header Strict-Transport-Security "max-age=31536000;";

max-age,单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过 HTTPS 协议来访问。也就是对于这个网站的 HTTP 地址,浏览器需要先在本地替换为 HTTPS 之后再发送请求。

includeSubDomains,可选参数,如果指定这个参数,表明这个网站所有子域名也必须通过 HTTPS 协议来访问。

preload, 将域名加入 HSTS Preload List, 但是有这个参数也不一定能加入.

HSTS 这个响应头只能用于 HTTPS 响应;网站必须使用默认的 443 端口;必须使用域名,不能是 IP。而且启用 HSTS 之后,一旦网站证书错误,用户无法选择忽略。

配置生效

最后打开chrome://net-internals/#hsts, 在 Query domain 中输入自己的域名 (不加 http), 搜索一下试试. 往后, 只要用户不清缓存, 就会直接通过https://xxxx.com:443 访问网站, 而不是通过 http 重定向到 https 的方式了.

--EOF--

评论  
留下你的脚步
推荐阅读