请先阅读上篇,了解背景和表现:Https中301,302,303,307那些事
1 what 、why、how
1.1 what-官方解释
摘自维基百科:HTTP严格传输安全(英语:HTTP Strict Transport Security,缩写:HSTS)是一套由互联网工程任务组发布的互联网安全策略机制。网站可以选择使用HSTS策略,来让浏览器强制使用HTTPS与网站进行通信,以减少会话劫持风险。其征求修正意见书文件编号是RFC 6797,发布于2012年11月。
1.2 why -用户使用场景
简单来说,平时我们访问百度、淘宝、京东时相信不会有人去输入标准的https://www.baidu.com
这样的格式,大部分输入的都是baidu.com
、taobao.com
、jd.com
这样的格式。
那么在之前,这样的格式会进行3xx跳转,跳转到最终的标准格式https://www.taobao.com
,是通过http://www.taobao.com
进行3xx响应后跳转过去的,在http协议下,劫持风险依然存在,那么用户每次都输入xx.com
,每次访问则都会存在劫持风险,这样显然是不合理的。
因此衍生了HSTS,在域名HSTS协议生效的情况下,用户输入baidu.com
这类形式的域名,不会再有3xx的情况,而是浏览器自动把所有尝试使用HTTP的请求自动替换为HTTPS请求,降低了劫持风险,提高通信安全性。
1.3 how-你的网站如何启用HSTS协议
如何使用总体来说比较简单
- 在服务器响应头中设置Strict-Transport-Security字段,可以设置max-age表示生效时间
- 用户访问时,服务器会种下这个头
- 下次如果使用 http 访问,只要 max-age 未过期,客户端会进行内部跳转,可以看到 307 Redirect Internel 的响应码
- 变成 https 访问源服务器
响应头效果如下:
strict-transport-security: max-age=31536000
在 HSTS 中,307 可以被缓存,缓存时间根据上述 max-age 而定,一般建议缓存 1 年甚至更长,再次访问直接就是https://www.baidu.com
200的状态码,浏览器会帮站点做内部的跳转。
2 一问一答
2.1 支持HSTS协议的浏览器有哪些?
Chromium和Google Chrome从4.0.211.0版本开始支持HSTS Firefox 4及以上版本 Opera 12及以上版本 Safari从OS X Mavericks起 nternet Explorer从Windows 10技术预览版开始支持,之后微软又向IE11用户推送了支持HSTS的更新。
[上述浏览器摘自简书简书 - 创作你的创作]
2.2 Chrome查看HSTS协议的工具
chrome://net-internals/#hsts
在该工具上可以自行查找域名的sts信息,比如说我查找www.baidu.com
得到结果如下:
static_sts_domain:
static_upgrade_mode: UNKNOWN
static_sts_include_subdomains:
static_sts_observed:
static_pkp_domain:
static_pkp_include_subdomains:
static_pkp_observed:
static_spki_hashes:
dynamic_sts_domain: www.baidu.com
dynamic_upgrade_mode: FORCE_HTTPS
dynamic_sts_include_subdomains: false
dynamic_sts_observed: 1547560068.213702
dynamic_sts_expiry: 1547732868.213698
dynamic_pkp_domain:
dynamic_pkp_include_subdomains:
dynamic_pkp_observed:
dynamic_pkp_expiry:
dynamic_spki_hashes:
2.3 HSTS preload list是什么?
HSTS preload list是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也在采用这个列表。
2.4 Nginx如何配置HSTS?
server {
listen 443;
server_name xxx.com;
ssl on;
...
add_header Strict-Transport-Security "max-age=31536000" always;
location / {
...
}
}
3 坑
- 纯IP的请求,HSTS无法识别
- HSTS 只能在 80 和 443 端口之间切换,如果服务是 8080 端口,即便设置了 STS也无效
- 首次访问时依然存在劫持风险
- 通过伪造浏览器时间来失效STS
4 收益
- 降低劫持风险
- 降低请求次数,节省响应时间