oIsCore-secured-with-HSTS

开启HSTS (HTTP Strict Transport Security)的重要性

HSTS (HTTP Strict Transport Security) 是什么,为什么我们要开启HSTS (HTTP Strict Transport Security)?

关于HTTPS的回顾

The security of HTTPS is that of the underlying TLS, which typically uses long-term public and private keys to generate a short term session key which is then used to encrypt the data flow between client and server. X.509 certificates are used to authenticate the server (and sometimes the client as well). As a consequence, certificate authorities and public key certificates are necessary to verify the relation between the certificate and its owner, as well as to generate, sign, and administer the validity of certificates. 

超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,也被称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种网络安全传输协议。在计算机网络上,HTTPS经由超文本传输协议进行通讯,但利用SSL/TLS来对数据包进行加密。HTTPS开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性。

关于开启HTTPS的重要性,Javen前面发文简要说过:https://javenfeng.com/enable-site-wide-importance-of-https-encryption-to-protect-privacy

因为HTTPS连接所用的公钥以明文传输,因此中国大陆的防火长城可以对特定网站按照匹配的黑名单证书,通过伪装成对方向连接两端的计算机发送RST包干扰两台计算机间正常的TCP通讯,以打断与特定IP地址之间的443端口握手,或者直接使握手的数据包丢弃,导致握手失败,从而导致TLS连接失败。这也是一种互联网信息审查和屏蔽的技术手段。

为什么我们要开启HSTS (HTTP Strict Transport Security)?

HTTP Strict Transport Security (HSTS) is a web security policy mechanism which helps to protect secure HTTPS websites against downgrade attacks and cookie hijacking. It allows web servers to declare that web browsers (or other complying user agents) should only interact with it using secure HTTPS connections,[1] and never via the insecure HTTP protocol. HSTS is an IETF standards track protocol and is specified in RFC 6797.

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

其征求修正意见书文件编号是RFC 6797,发布于2012年11月。

hsts-sketchnotes-3ae61d274d86dd9703accbe01fc2211c

A server implements an HSTS policy by supplying a header over an HTTPS connection (HSTS headers over HTTP are ignored). For example, a server could send a header such that future requests to the domain for the next year (max-age is specified in seconds, 31536000 is approximately one year) use only HTTPS: Strict-Transport-Security: max-age=31536000;.

When a web application issues HSTS Policy to user agents, conformant user agents behave as follows:

  1. Automatically turn any insecure links referencing the web application into secure links. (For instance,http://example.com/some/page/ will be modified to https://example.com/some/page/ before accessing the server.)
  2. If the security of the connection cannot be ensured (e.g. the server’s TLS certificate is not trusted), show an error message and do not allow the user to access the web application.

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可以用来抵御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小时。

如何开启HSTS?

HSTS 简单来说就是强制 HTTPS。这需要分两步,第一步是你的服务器声明愿意放弃HTTP强制所有访问为安全的HTTPS。第二步是向几大浏览器 提起申请。在没有正式接受之前只要用户第一次访问之后,浏览器还是会记住你的HSTS爱好并且之后都会强制 HTTPS 而不是由服务端通过 301转向。第二步需要慎用,因为据说难以反悔。一般来说只进行第一步就可以了。

# max-age: 记住的时长, 单位是秒 (31536000 = 1 年)
# includeSubdomains: 所有子域名都强制使用 https 访问, 这个如果不确定千万别开。
# preload: 告诉浏览器可以预加载你的域名的 HSTS。

Nginx

只需在网站的nginx文件中server下添加如下语句:

 

重启Nginx:

Apache2

在站点配置文件/etc/apache2/sites-enabled里你需要在SSL节点加入一行即可。

重启apache2:

 

 

相关文章:

CloudFlare已启用HTTP/2和SPDY

沃通免费SSL加密证书申请教程

  1. 禅猫

    我不知道为啥,去提交hsts,总是提示我http page head 没有hsts标记,我去了,关http什么鸟事

    • 有頁面有錯誤有衝突的吧。我是直接在nginx文件裏加上那句話就OK了,系統是Cent OS,軍哥lnmp

      • 禅猫

        解决了,我做的301转向,80端口还是暴露的,所以直接在server里 做80端口转向到https就解决了

  2. Pingback: 如何让网站安全系数达到A+级别 – 好窝博客

  3. Header always set Strict-Transport-Security “max-age=15552000; includeSubdomains; preload”
    这一行是加在下面嘛?

  4. Pingback: 快速注册Let’s Encrypt SSL证书并设置自动续期 | 好窝博客

    • 自个人博客诞生时就是逼格出现时,何必否认,认了就好。
      没有小站的安全意识的觉醒,也必然没有全民大站的普遍重视。
      所有的文章都不是仅仅针对个人博客的,不要总停留在逼格这个认知层次上。其实靠个人生活内容你也未必能拔得头筹,知识本就是一种内容。只是你用不到而已,关注点不同而已。
      要说20年前大哥大是后逼格的了,然而现在人手一个大屏手机的年代,你让那个年代的人怎么看?

    • SPDY模块和HTTPS出现之前,HTTPS确实不那么急迫。在SPDY出现,到现在过度到HTTP2之后,HTTPS就是日后的趋势,我认为的标配。HTTP2的加速效果还是很明显的。尤其是Let’s Encrypt这种可靠权威的免费SSL证书签发机构出来之后,加上证书的成本大大降低。加个SSL和开启GZIP的重要性是同等的。当然,如果GZIP都不关注的,只是纯关注内容的博主,确实没什么必要

  5. Pingback: 升级LNMP一键安装包以支持HTTP/2 | 好窝博客

      • 按照规范,每次浏览器访问https网站,都会根据头信息更新max-age的,所以之后设置max-age为一个很小的值即可让浏览器的强制https失效。
        所以我觉得,虽然preload并不是一个标准用法,不过应该会遵循规范,可以反悔吧。

      • 刚看了一下 https://hstspreload.appspot.com/ 说明,这个虽然可以申请移除列表,但是可能非常慢,所以如果不是百分之百不回到http,建议不preload,或者设置max-age为加入preload列表要求的最低18周,提前18周准备降级http。

        • 以前在CloudFlare上,就看到HSTS下有一大段提醒的话,所以一直没敢用。不过既然没打算提交到列表,也就无妨了,刚加了子域名和preload,发现所有子域名都自动https了,然后移除了就又是http了,也就是说,只要不上传到列表,在自己服务器上永远都可以随时“反悔”,只是头一次浏览器还是要HTTP转HTTPS。开启了DNSSEC问题应该不大。

    • 开HSTS不需要付费,自己配置一下就可以了,就是告诉浏览器要强制走HTTPS

  6. 之前看你折腾我也没太在意,今天睡不着搜了下,盯上半个多小时除了知道能防御剥离攻击外其他再无斩获,可能我真的不适合折腾。

  7. 话说最近很多站长和博主均有这些方面的情况、看到一些博文均有讲到;好书网的ssl倒是申请下来了、但是不太会使用而且听说使用之后对于站内所投放的广告联盟代码有影响。。。

    • 具体你可以问问百度,随着谷歌的解禁,我觉得百度会被倒逼改革,承认HTTPS的地位并最大限度地支持它的发展。

轻轻地,你来了,请留下你的脚印。