什么是HTTP严格传输安全(HSTS)以及如何添加此功能

原创 qtwrk  2017-11-05 07:49  阅读 154 次 评论 1 条

转载自维基百科

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的安全性,也就是需要部署域名系统安全扩展。截至2016年这一方案没有大规模部署。

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

 

HSTS还有一个功能,可以为开启了HTTPS的网站节省了301跳转的时间。

一般情况下,用户访问 http://vps.group/ , 将会301跳转到 httpS://vps.group, 那么就多浪费了一次301的时间。

而启用了HSTS后,第二次,第三次,以及以后的访问,即使用户输入http://vps.group,浏览器也会自动替换成httpS://vps.group 而不需要访问服务器,接收301指令再进行跳转。

如何添加此功能:

LiteSpeed和Apache可以通过.htaccess文件,

添加以下内容

Header set Strict-Transport-Security "max-age=15552000;"

解释: max-age为时效,15552000秒为180天。第一次设置可以先设置为短时间,比如300秒先做测试。

可选参数有Preload和includeSubDomains。

Preload为申请将域名添加到浏览器自带HSTS列表中时需要用到。

includeSubDomains,是否将子域名也设置为HSTS,即设置后,包括根域名和子域名,所有域名都将必须启用HTTPS,否则将无法访问。

 

Nginx通过.conf配置文件

打开网站的.conf文件,添加

add_header Strict-Transport-Security "max-age=15552000;";

执行命令

nginx -t

检查是否有错误,如果没有,执行

nginx -s reload

重读配置文件

 

完成后,可以通过检查http响应头查看是否正确设置

Chrome,按F12打开开发者工具

本文地址:https://vps.group/hsts-20171105.html
版权声明:本文为原创文章,版权归 qtwrk 所有,欢迎分享本文,转载请保留出处!

发表评论


表情