HSTS详解原理及配置从HTTP到HTTPS再到HSTS
2023年11月27日
114
HTTPS大家并不陌生,可以理解为更加安全HTTP,然而网站通过HTTPS提供服务也不是安全的,这时候HSTS出现了

image.png

HTTPS大家并不陌生,可以理解为更加安全HTTP,然而网站通过HTTPS提供服务也不是安全的,这时候HSTS出现了。

HSTS背景之HTTPS并不那么安全

最初网站是通过HTTP协议提供服务,安全起见,网站升级为HTTPS协议,可是当用户在浏览器中输入网址时,浏览器会网站发起一次HTTP请求,这是浏览器获取到一个重定向到HTTPS的请求,然后再使用HTTPS协议通信。注意,问题来了,不是已经升级为更加安全的HTTPS了吗?这个操作,不是又使用了一次HTTP么?是的,当用户直接输入网址时(不带https://),由于在建立起HTTPS连接之前存在一次明文的HTTP请求和重定向,这个过程很容易被攻击者利用,攻击者可以以中间人的方式劫持这次请求,从而进行后续的攻击,例如窃听数据,篡改请求和响应,跳转到钓鱼网站等。

HSTS让HTTPS更加安全

我们如何避免这次明文的HTTP请求和重定向呢?我们希望浏览器能够聪明一点,当用户输入网址时(不带https://)浏览器能够自动将其转换成HTTPS请求,从而绕过明文的HTTP请求和重定向,那么,浏览器怎么能做到呢?浏览器怎么知道这个网站是使用HTTPS协议呢?ok,HSTS粉墨登场!HSTS可以告诉浏览器这个网站是否是使用的HTTPS。

HSTS原理

HSTS的全称是HTTP Strict-Transport-Security,它是一个Web安全策略机制。

HSTS的核心是HTTP响应头(HTTP Response Header),它告诉浏览器在接下来的一段时间,这个域名只能通过HTTPS进行访问,如果该域名在浏览器中出现不安全访问,HSTS会强制用户的访问。

HSTS配置

新手站长网说过,HSTS的核心是HTTP响应头,HSTS Header的语法:


  • max-age是必选参数,是一个以秒为单位的数值,它代表着HSTS Header的过期时间,通常设置为1年,即31536000秒;

  • includeSubDomains是可选参数,如果包含它,则意味着当前域名及其子域名均开启HSTS保护;

  • preload是可选参数,只有当你申请将自己的域名加入到浏览器内置列表的时候才需要使用到(关于Preload List会在本文底部继续聊一聊)。

  • 这个HSTS Header可以在服务器、程序框架、反向代理服务器都可以设置,例如在代理服务器中设置,以Nginx为例,在配置文件中加入:

    注意:设置有效期为31536000秒(1年),一定要小心了,如果网站SSL证书出现问题,那么用户在一年的时间里都没法正常访问你的网站了,当然,除非用户清除了浏览器缓存。

    在服务器返回给浏览器的响应头中,增加Strict-Transport-Security这个HSTS Header,例如:

    上述例子中我们将max-age设置为31536000秒(1年),这是告诉浏览器,在接下来的1年时间中,当前域名以及其子域名的后续通信需要强制使用HTTPS,直至过期(1年后)。随着用户和网站之间的交互,这个有效期是动态刷新的,所以不用担心过期的问题。

    HSTS也不安全!

    纳尼?HSTS也不安全?是的,HSTS有一个弱点,假设浏览器中没有该域名的HSTS信息时,用户第一次访问该网站时,依然需要使用明文的HTTP请求和重定向,这又给攻击者留下了可乘之机,那怎么办?HSTS也不是傻子,新手站长网来聊一聊Preload List。

    HSTS的Preload List

    HSTS也不是傻子,HSTS的解决方法是在浏览器中内置一个列表,只要这个域名在浏览器内置的列表中,浏览器就要对这个域名使用HTTPS连接。这个列表就是Preload List,Preload List是由Google Chromium维护的,FireFox、Safari、IE等主流浏览器均在这个列表。

    如何加入HSTS Preload List?

    加入HSTS Preload List的官网条件:

  • 具备一个有效的证书

  • 在同一台主机上提供重定向响应,以及接收重定向过来的HTTPS请求

  • 所有子域名均使用HTTPS

  • 在根域名的HTTP响应头中,加入HSTS Header,并满足下列条件:

    过期时间最短不得少于18周(10886400秒)
    必须包含includeSubDomains参数
    必须包含preload参数

  • 请按照上述官方罗列的条件,仔细检查好自己的网站,符合规定后,在https://hstspreload.org上提交申请即可。符合条件的情况下,加入Preload List大约需要7-15天,也可能更快。

    怎么查询域名是否加入了HSTS Preload List?

    查询域名是否加入了HSTS Preload List中有两种方法,即通过官网https://hstspreload.org查询,或者通过Chrome谷歌浏览器查询。

    方法一:通过官网查询域名是否加入到HSTS Preload List,地址:https://hstspreload.org
    方法二:通过Chrome查询,在Chrome地址栏中输入chrome://net-internals/#hsts查询。