为什么要开启 HSTS
在网站开启全站 HTTPS 后,如果用户端从浏览器手动输入的是 HTTP 地址,或者从其它地方点击了网站的 HTTP 链接,那么浏览器会依赖于服务端 301/302 跳转才能使用 HTTPS 服务。而第一次的 HTTP 请求就有可能被劫持,导致请求无法到达服务器,从而构成 HTTPS 降级劫持。
什么是 HSTS
HSTS(HTTP Strict Transport Security,HTTP 严格传输安全),是一套由互联网工程任务组发布的互联网安全策略机制。网站可以通过配置 HSTS,来强制浏览器使用 HTTPS 与网站通信,保障网站更加安全。
HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。
比如,https://example.com/
的响应头含有Strict-Transport-Security: max-age=31536000; includeSubDomains
。这意味着两点:
在接下来的一年(即31536000秒)中,浏览器只要向example.com
或其子域名发送HTTP请求时,必须采用HTTPS
来发起连接。比如,用户点击超链接或在地址栏输入 http://www.example.com/
,浏览器应当自动将 http 转写成 https
,然后直接向 https://www.example.com/
发送请求。
在接下来的一年中,如果 example.com
服务器发送的TLS
证书无效,用户不能忽略浏览器警告继续访问网站。
nginx 配置
在 server 段中添加响应头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
- max-age,单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过 HTTPS 协议来访问。也就是对于这个网站的 HTTP 地址,浏览器需要先在本地替换为 HTTPS 之后再发送请求。
- includeSubDomains,可选参数,如果指定这个参数,表明这个网站所有子域名也必须通过 HTTPS 协议来访问。
- preload,可选参数
HSTS 这个响应头只能用于 HTTPS 响应;网站必须使用默认的 443 端口;必须使用域名,不能是 IP。而且启用 HSTS 之后,一旦网站证书错误,用户无法选择忽略。
浏览器请求后响应头中会显示
strict-transport-security:max-age=31536000
关于 HSTS 这部分的内容,可以扩展阅读下这篇文章
又拍云开启 HSTS
1.找到对应的服务,切换到 HTTPS,可以看到 HSTS 的配置
2.点击管理,然后添加一条规则
3.然后开启 HSTS
- 选择要开启的域名
- 点击启用 HSTS 按钮
- 配置缓存,HSTS 默认要求必须配置时间为180天
- 开启子域名名,那么你的子域名都必须配置 HTTPS
- 预加载,这个要慎重,具体阅读下面的内容
注意,下面这段摘自https://imququ.com/post/sth-about-switch-to-https.html
HSTS 可以很好的解决 HTTPS 降级攻击,但是对于 HSTS 生效前的首次 HTTP 请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了 HSTS Preload List 方案:内置一份可以定期更新的列表,对于列表中的域名,即使用户之前没有访问过,也会使用 HTTPS 协议。
目前这个 Preload List 由 Google Chrome 维护,Chrome、Firefox、Safari、IE 11 和 Microsoft Edge 都在使用。如果要想把自己的域名加进这个列表,首先需要满足以下条件:
拥有合法的证书(如果使用 SHA-1 证书,过期时间必须早于 2016 年);
将所有 HTTP 流量重定向到 HTTPS;
确保所有子域名都启用了 HTTPS;
输出 HSTS 响应头:
max-age 不能低于 18 周(10886400 秒);
必须指定 includeSubdomains 参数;
必须指定 preload 参数;
即便满足了上述所有条件,也不一定能进入 HSTS Preload List,更多信息可以看这里。通过 Chrome 的 chrome://net-internals/#hsts 工具,可以查询某个网站是否在 Preload List 之中,还可以手动把某个域名加到本机 Preload List。
对于 HSTS 以及 HSTS Preload List,我的建议是只要你不能确保永远提供 HTTPS 服务,就不要启用。因为一旦 HSTS 生效,你再想把网站重定向为 HTTP,之前的老用户会被无限重定向,唯一的办法是换新域名。
如果确定要开启,点击https://hstspreload.org
输入你的域名,勾选协议,注意看清楚哦,提交了就没有机会反悔了。
确认后,你就可以将你的域名提交给 HSTS 预加载列表了
提交成功后会给你返回成功的信息,不过你要保证你的配置比如是一直开启了,否则也会从列表中删除。
再次访问,查看浏览器响应头