HTTP严格传输安全(HSTS)简介

HSTS

默认情况下用户不声明使用何种协议,首先访问到的是HTTP协议下的网站,当且仅当服务器端设置301或302跳转,浏览器才会跳转到HTTPS协议。而用户明确要求过一次使用HTTPS协议后,若不再次明确声明使用HTTPS协议,浏览器仍然默认使用HTTP协议。因此HSTS应运而生,通过在HTTPS协议中的报头加入
Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
使浏览器在接下来expireTime的时间(以秒计)内强制使用HTTPS协议,即使用户明确声明使用HTTP协议,浏览器仍然会按HTTPS协议发出请求。若SSL证书有误或服务器不支持HTTPS,均会明确提示用户存在安全性问题。其中includeSubDomains,如果指定这个参数,表明这个网站所有子域名也必须通过HTTPS协议来访问。

配置HSTS

以Ubuntu下的Apache2为例

 # 首先强制跳转所有非HTTPS请求
 RewriteEngine on
 RewriteCond %{SERVER_PORT} !^443$
 RewriteRule ^/?(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
 # 然后针对特定网站设置HSTS
 SSLEngine on
 ……
 Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
 ……

HSTS preload

HSTS并不能保护用户第一次访问的安全。因为如果第一次用户访问被劫持,HSTS根本无法生效。解决方法就落在了浏览器上,通过指定上述的preload参数,并将网站域名加入Chrome的HTTP Strict Transport Security (HSTS) preload list就能使得网站域名被硬编码进Chrome浏览器中,其他主流的浏览器也会将Chrome的列表内置。但一个域名进入浏览器的内置HSTS列表后,浏览器的行为与成功完成第一次HTTPS握手后的行为一致。通过hstspreload.org申请加入即可

SSL安全性评级

登陆SSL Server Test可分析网站的SSL安全性。

用户强制浏览器对特定网站启用HSTS

这种需求仅在特定情况下产生,例如运营商劫持之类的情况。Chrome用户通过打开chrome://net-internals/#hsts将需要启用HSTS的网站域名加入即可。

留下评论