前言
今天发现又拍云提供了一个 HTTPS安全检测工具,看到如果增加 HSTS 参数,可以让评级升级,果断了解一波。
HSTS
HSTS 是一种安全机制,主流网站 HTTP -> HTTPS 的方式都是返回 301 重定向到 HTTPS 地址,但是这样会多一次连接跳转,这样第一次请求的 HTTP 连接存在被会话劫持的风险,而且这样也会拉长网站的响应时间,而采用 HSTS 策略的网站会保证浏览器始终连接到该网站的 HTTPS 加密版本,不需要用户手动在 URL 地址栏中输入加密地址,减少一次请求,加快响应。
为了避免 HSTS 生效前的首次 HTTP 请求被劫持,保证安全性浏览器厂商们提出了 HSTS Preload List
方案:内置一份定期更新的 HSTS
域名列表,对于列表中的域名,即使用户之前没有访问过,也会使用 HTTPS 协议。
可以在此查看已经加入的列表:https://hstspreload.org/
Nginx 添加 HSTS 的支持
支持 HSTS 也很简单,只需要在返回头中增加 Strict-Transport-Security
字段即可,并且建议拉长缓存时间,又拍云的建议是填写半年以上,我这里直接填写的一年,然后其中 includeSubDomains
会将该域名下的所有子域名也同时开启 HSTS,如果不需要可以不加。最终如下所示:
server {
......
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
......
}
重启 Nginx,再运行又拍云的 HTTPS 检测,完美搞定,over。
将自己的域名加到 HSTS Preload List 名单中
如果你也想将自己的域名加入到浏览器厂商的白名单中,首先要满足以下几点:
- 有效的 SSL/TLS 证书
- 重定向所有的 HTTP 流量到 HTTPS
- 必须声明
includeSubdomains
,全部子域名的流量均通过 HTTPS - 在相应的域名中输出 HSTS 响应头
- HSTS 过期时间至少大于 18 周(10886400 秒)
- 必须声明
preload
然后在 https://hstspreload.org/
中提交自己的域名,如果以上要求全部通过,静待几天到几个周不等之后就可以看到自己的域名已经加入到 HSTS Preload List
中了。
includeSubDomains 字段会把所有子域都开启 HSTS,博主应该写一下
呃... 感谢感谢,写的时候疏忽了
安全吗?
安全的,业界主流解决方案
这个已经设置了,很好用
其实如果使用 CDN 的话,服务器上没有这个也可以的! CDN 一般都会要求设定的!