HSTS详解

HTTPS的不安全引出HSTS

用户在访问某个https网站时,不输入https://,而是输入http://。此时交互的流程是这样的:

可以看出,交互的过程需要一个重定向来实现。在重定向到https之前,是http协议进行交互的。而这就存在被中间人攻击的问题。

HSTS的解决之道

我们期望的浏览器行为是,当用户让浏览器发起HTTP请求的时候,浏览器将其转换为HTTPS请求,直接略过上述的HTTP请求和重定向,从而使得中间人攻击失效,规避风险。

HSTS全称Http Strict-Transport-Security。是web安全策略机制。

HSTS的核心是HTTP响应头,正是这个头可以让浏览器之道,当前域名只能通过HTTPS进行访问,并且在浏览器发现当前连接不安全的情况下,强制拒绝用户的后续访问要求。

HSTS Header的语法如下:

Strict-Transport-Security: [; includeSubDomains][; preload]

  • max-age,必选,单位秒,代表着HSTS Header的过期时间
  • includeSubDomains,可选,如果包含它,则意味着当前域名及其子域名均开启HSTS保护
  • preload,可选,只有当你申请将自己的域名加入到浏览器内置列表的时候才需要使用到它。

HSTS Header是怎么来的?

HSTS Header是服务端下发给客户端的,并且是每个响应里都有,因此会不断刷新。交互的流程是:

More

使用HSTS可以做到让浏览器强制拒绝不安全的链接,不给用户选择的机会。

在没有HSTS保护的情况下,当浏览器发现当前网站的证书出现错误,或者浏览器和服务器之间的通信不安全,无法建立HTTPS连接的时候,浏览器通常会警告用户,但是却又允许用户继续不安全的访问。

而有了HSTS后,浏览器将会彻底阻止用户继续访问。

风险

可以看出,上面还是有个漏洞的,就是在浏览器没有HSTS信息,或者首次访问网站时,依然需要一次明文的HTTP请求和重定向才能切换到HTTPS,以及刷新HSTS信息。而就是这么一瞬间却给攻击者留下了可乘之机。

应对之道:Preload List

即预置HSTS header,只要是在这个列表里的域名,无论何时、何种情况,浏览器都只使用HTTPS发起连接。

网站在具备以下几个条件后,可以提出申请加入到Preload List

  • 具备一个有效的证书
  • 在同一台主机上提供重定向响应,以及接收重定向过来的HTTPS请求
  • 所有子域名均使用HTTPS
  • 在根域名的HTTP响应头中,加入HSTS Header,并满足下列条件:
    • 过期时间最短不得少于18周(10886400秒)
    • 必须包含includeSubDomains参数
    • 必须包含preload参数
    • 当你准好这些之后,可以在HSTS Preload List的官网上(https://hstspreload.org)提交申请

可以在Chrome地址栏里输入chrome://net-internals/#hsts查询状态。

results matching ""

    No results matching ""