Hsts安全协议总结

请先阅读上篇,了解背景和表现: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.comtaobao.comjd.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协议

如何使用总体来说比较简单

  1. 在服务器响应头中设置Strict-Transport-Security字段,可以设置max-age表示生效时间
  2. 用户访问时,服务器会种下这个头
  3. 下次如果使用 http 访问,只要 max-age 未过期,客户端会进行内部跳转,可以看到 307 Redirect Internel 的响应码
  4. 变成 https 访问源服务器

响应头效果如下: strict-transport-security: max-age=31536000 在 HSTS 中,307 可以被缓存,缓存时间根据上述 max-age 而定,一般建议缓存 1 年甚至更长,再次访问直接就是https://www.baidu.com200的状态码,浏览器会帮站点做内部的跳转。

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 收益

  • 降低劫持风险
  • 降低请求次数,节省响应时间