HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源,而不是HTTP。启用 HSTS 不仅仅可以有效防范中间人攻击,同时也为浏览器节省来一次 302/301 的跳转请求,如果配置了HSTS,网站则通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求。

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

作用

HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器建立连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议(HTTP)响应头中包含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

服务器配置

如果服务器环境是WAMP、PHPStudy、Lamp、Apache都可以参考本篇文章进行配置。

找到Apache服务器的主要配置文件:httpd.conf,使用Noedpad++(建议)查找代码mod_headers.so,如果前面有#号则删除,没有则无需更改。

Apache的配置文件httpd.conf

	LoadModule headers_module modules/mod_mod_headers.so  #如果开头有#号则删除,没有则无需修改。

打开网站的配置文件,在<VirtualHost *:443>模块内添加以下代码:

	Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"

配置Apache的HSTS

修改完成后重启Apache服务。可以通过chrome浏览器的开发者选项→网络项查看服务器返回的头信息,或者通过证书检测工具来检测是否开启HSTS。

查看是否成功开启HSTS