共计 1393 个字符,预计需要花费 4 分钟才能阅读完成。
在网站全站HTTPS后,如果用户手动敲入网站的HTTP地址,或者从其它地方点击了网站的HTTP链接,通常依赖于服务端301/302跳转才能使用HTTPS服务。而第一次的HTTP请求就有可能被劫持,导致请求无法到达服务器,从而构成HTTPS降级劫持。这个问题目前可以通过HSTS(HTTP Strict Transport Security,RFC6797)来解决。
HSTS简介
HSTS(HTTP Strict Transport Security)是国际互联网工程组织IETF发布的一种互联网安全策略机制。采用HSTS策略的网站将保证浏览器始终连接到该网站的HTTPS加密版本,不需要用户手动在URL地址栏中输入加密地址,以减少会话劫持风险。
HSTS响应头格式
[v_notice]
Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
- max-age,单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过HTTPS协议来访问。也就是对于这个网站的HTTP地址,浏览器需要先在本地替换为HTTPS之后再发送请求。
- includeSubDomains,可选参数,如果指定这个参数,表明这个网站所有子域名也必须通过HTTPS协议来访问。
- preload,可选参数,一个浏览器内置的使用HTTPS的域名列表。[/v_notice]
支持HSTS浏览器
目前主流浏览器都已经支持HSTS特性,具体可参考下面列表:
- Google Chrome 4及以上版本
- Firefox 4及以上版本
- Opera 12及以上版本
- Safari从OS X Mavericks起
- Internet Explorer及以上版本
Apache上启用HSTS
# 开启HSTS需要启用headers模块
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
#将所有访问者重定向到HTTPS,解决HSTS首次访问问题。
RedirectPermanent / https://www.srelife.cn/
<VirtualHost 0.0.0.0:443>
# 启用HTTP严格传输安全
Header always set Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”
重启apache服务
Nginx上启用HSTS
结果测试
设置完成了后,可以用curl命令验证下是否设置成功。如果出来的结果中含有Strict-Transport-Security的字段,那么说明设置成功了。