HSTS
什么是HSTS?
HSTS 是 HTTP 严格传输安全(HTTP Strict Transport Security) 的缩写。 这是一种网站用来声明他们只能使用安全连接(HTTPS)访问的方法。 如果一个网站声明了 HSTS 策略,浏览器必须拒绝所有的 HTTP 连接并阻止用户接受不安全的 SSL 证书。 目前大多数主流浏览器都支持 HSTS (只有一些移动浏览器无法使用它)。
为什么要使用HSTS?
在 2012 年的 RFC 6797 中,HTTP严格传输安全被定义为网络安全标准。 创建这个标准的主要目的,是为了避免用户遭受使用 SSL stripping(剥离) 的 中间人攻击(man-in-The-middle,MITM)。 SSL stripping 是一种攻击者强迫浏览器使用 HTTP 协议连接到站点的技术,这样他们就可以嗅探数据包,拦截或修改敏感信息。 另外,HSTS 也是一个很好的保护自己免受 cookie 劫持(cookie hijacking)的方法。
如何开启HSTS?
on Apache
- 在
httpd.conf文件中加载headers模块:
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
- 在
VirtualHost 0.0.0.0:443中添加下面代码行:
<VirtualHost 0.0.0.0:443>
ServerName mozhijiang.top
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
Header always set Strict-Transport-Security "max-age=15768000; includeSubdomains; preload"
</VirtualHost>
on Nginx
server {
listen 443 ssl;
server_name mozhijiang.top;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
}
includeSubDomains表示对所有子域名生效。
preload是使用浏览器内置的域名列表。
如何保证开启HSTS后只能使用HTTPS?
假设我们在已开启HSTS的网站使用http访问,mozhijiang.top。
WebServer收到请求后会将请求重定向到 HTTPS 站点,接下来浏览器使用 HTTPS访问网站,WebServer会在Response Headers里加入
Strict-Transport-Security: max-age=15768000; includeSubdomains; preload
测试一下
未开启HSTS之前
开启之后
已重定向到htps://mozhijiang.top;
再次访问htps://mozhijiang.top
Response Headers已加上
Strict-Transport-Security: max-age=15768000; includeSubdomains; preload