HTTP严格安全传输之HSTS:HTTP Strict Transport Security
Author:zhoulujun Date:
一个网站没有开启HTTP Strict Transport Security ,虽然对http做了强制跳转到https,如用户直接输入域名访问,默认就是http访问,强制跳转到https,nginx配置如下
error_page 497 https://$host$request_uri; #当网站只允许https访问时,当用http访问时nginx会报出497错误码
但是从http://zhoulujun.cn 跳转到https://zhoulujun.cn,这个中间会存在中间人攻击,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息,网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求。
对于篡改302的攻击,建议服务器开启HTTP Strict Transport Security功能,这个功能的含义是:
当用户已经安全的登录开启过htst功能的网站 (支持hsts功能的站点会在响应头中插入:Strict-Transport-Security) 之后,支持htst的浏览器(比如chrome. firefox)会自动将这个域名加入到HSTS列表,下次即使用户使用http访问这个网站,支持htst功能的浏览器就会自动发送https请求(前提是用户没有清空缓存,如果清空了缓存第一次访问还是明文,后续浏览器接收到服务器响应头中的Strict-Transport-Security,就会把域名加入到hsts缓存中,然后才会在发送请求前将http内部转换成https),而不是先发送http,然后重定向到https,这样就能避免中途的302重定向URL被篡改。进一步提高通信的安全性。
HSTS可以很大程度上解决SSL剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP
另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告。HSTS解决了这一问题,一旦服务器发送了HSTS字段,用户将不再允许忽略警告。
HSTS概念解析
首先看MDN HSTS解析:https://developer.mozilla.org/zh-CN/docs/Security/HTTP_Strict_Transport_Security
HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源,而不是HTTP。
设置HSTS
Strict-Transport-Security: <max-age=NUMBER>[; includeSubDomains][; preload]
max-age:单位:秒。 HSTS header 过期时间,一般设置为1年,即31536000秒。而每次Response Header都带上HSTS Header,则可不断刷新其过期时间。
Strict-Transport-Security参数说明
max-age:单位:秒。 HSTS header 过期时间,一般设置为1年,即31536000秒。而每次Response Header都带上HSTS Header,则可不断刷新其过期时间。
includeSubDomains:需要开启HSTS的域名/子域名。
preload:当加入了浏览器内置Preload List时才需要设置该项。
nginx配置 HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
HSTS重要性
一旦用户提出HSTS策略,它的缓存信息期由max-age指定。在此期间,浏览器将会拒绝通过未加密的HTTP访问web服务,并拒绝给予例外证书错误(如果该网站以前提交了一个有效可信的证书)。如果指定了一个includeSubDomanis参数,这些限制也同样适用于当前域下的所有子域。
保护客户端从HTTP拦截,从它看到STS头部到声明的max-age的期间内。然而,HSTS并不是HTTP回话劫持的完美解决方案。用户仍然容易受到攻击,如果他们通过HTTP访问HSTS保护的网站时:
以前从未访问过该网站
最近重新安装了其操作系统
最近重新安装了其浏览器
切换到新的浏览器
切换到一个新的设备如移动电话
删除浏览器的缓存
最近没访问过该站并且max-age过期了
为了解决这个问题,google坚持维护了一个“HSTS preload list”的站点域名和子域名,并通过https://hstspreload.appspot.com/提交其域名。该域名列表被分发和硬编码到主流的web浏览器。客户端访问此列表中的域名将主动的使用HTTPS,并拒绝使用HTTP访问该站点。
实现原理
关于HSTS之浏览器 chromuim 源码分析:《HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析》
参考文章:
NGINX配置HTTP HSTS协议 https://blog.csdn.net/yufei6808/article/details/82380887
为什么我们要使用HTTP Strict Transport Security? https://www.freebuf.com/articles/web/66827.html
转载本站文章《HTTP严格安全传输之HSTS:HTTP Strict Transport Security》,
请注明出处:https://www.zhoulujun.cn/html/webfront/SGML/web/2020_0122_8248.html