• home > webfront > SGML > web >

    HTTP严格安全传输之HSTS:HTTP Strict Transport Security

    Author:zhoulujun Date:

    设置HSTS,Strict-Transport-Security: [; includeSubDomains][; preload],nginx配置 HSTS:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains " always;HSTS可以很大程度上解决SSL剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连

    一个网站没有开启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保护的网站时:

    1. 以前从未访问过该网站

    2. 最近重新安装了其操作系统

    3. 最近重新安装了其浏览器

    4. 切换到新的浏览器

    5. 切换到一个新的设备如移动电话

    6. 删除浏览器的缓存

    7. 最近没访问过该站并且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