HSTS--提高你的https安全性
HSTS
背景:当访问我们的域名从http变成https时,安全性能得到了极大的提升。但这也不代表绝对的安全。
HSTS简介
HTTP严格传输安全协议 (HTTP Strict Transport Security,简称:HSTS),是一套由互联网工程任务组发布的互联网安全策略机制。网站可以选择使用HSTS策略,来让浏览器强制使用HTTPS与网站进行通信,以减少会话劫持风险。
使用HSTS和不适用HSTS的区别
不适用HSTS的情况
- 在浏览器的地址栏输入网址时,有时我们不会输入https协议,浏览器默认使用http进行访问。
- TCP握手成功后返回302状态码。
- 由于端口号进行改变,需要重新建立连接(源IP、目的IP、源端口、目的端口,这四个有任意一个条件改变即需要重新建立连接)
- 进行ssl认证
出现的问题:
- 前两步所耗费的rt是没有意义的,并且会让用户从感知上觉得网站相应慢
- 前面没有使用https,容易出现被攻击和劫持的情况。
使用HSTS的情况
在此域名设置的有效期之内,所有的http请求,人们无感知的情况下,在浏览器内部实现307跳转,向网站发起https请求
HSTS缺陷
- HSTS的实现是让通过
Strict-Transport-Security
这个HTTP Header
来告诉浏览器此域名需要使用HSTS功能,因此,第一次请求不可避免的可能需要使用http协议来访问,具体的解决办法是使用Preload
来避免第一次的http请求。 可以通过此网站来查看和申请https://hstspreload.org/?domain=www.facebook.com
- 当你的浏览器出现缓存并且你的证书出现异常时,可能会导致你的网站无法访问。直到证书问题修复或清楚缓存。
如何使用HSTS
在response请求头中添加Strict-Transport-Security
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains(可选); preload(可选,非标准)
设置HSTS的有效时间 - includeSubDomains表示是否适用于你网站的子域名
- preload 谷歌维护着一个 HSTS 预加载服务。按照指示成功提交你的域名后,浏览器将会永不使用非安全的方式连接到你的域名。虽然该服务是由谷歌提供的,但所有浏览器都有使用这份列表的意向(或者已经在用了)。但是,这不是 HSTS 标准的一部分,也不该被当作正式的内容。
nginx配置
可以在server块或http块中添加
示例:
add_header strict-transport-security max-age=86400;
可在浏览器中查看相应头信息
参考资料: