闲着写点简单的分享

我对HSTS的一些小了解

之前的文章《启用HSTS和申请HSTS Preload List》可能对一些概念解析得不是很好,也让人觉得多此一举,其实更多的是看自己的需求。这里再次重新整理,让更多人对HSTS有更好的了解,也算是对自己的一次知识深度的加强。


HSTS是HTTPS性能和安全优化中最重要的一环,能够给HTTPS带来巨大好处,但也存在一个小缺陷。本篇文章会介绍HSTS的工作原理及如何通过HSTS preload list解决HSTS的小缺陷。

什么是HSTS?

在介绍HSTS之前,先来看看最典型的用户访问过程:

首先假设要访问的网站是全站HTTPS但未开启HSTS

  1. 一般地,用户在客户端访问一个网站的时候,往往只输入域名,而不带有协议名。例如访问我的博客www.linpx.com,而不是https://www.linpx.com
  2. 输入www.linpx.com访问,客户端与服务器来一次TCP三次握手,建立连接;
  3. 然后做301/302跳转到HTTPS;
  4. 客户端与服务器再来一次TCP握手,重新建连;
  5. 然后开始TSL(SSL)通信···

过程流图如下:

         +-------+                  +-------+
         | 客户端 |                  | 服务器 |
         +--+----+                  +---+---+
            |                           |
            |  <--------------------->  |   TCP三次握手
            |                           |
            |                           |
            |  <--------------------->  |   301/302 http -> https
            |                           |
            |                           |
            |  <--------------------->  |   TCP 三次握手
            |                           |
            |                           |
            |                           |
Clinet Hello|  +--------------------->  |  Server Hello
            |                           |
            |                           |
            |  <---------------------+  |  发送Certificate报文
            |                           |
            |                           |
            |  <---------------------+  |  Server Hello Done
            |                           |
            |                           |
            +                           +

整个过程明显存在两个不足之处:

  • 第一次的TCP握手和跳转是没有意义的;
  • 其中第一次TCP握手是不安全的HTTP通信,通信依然存在被窃听,被伪装和报文被慕改的可能。

所以才有HSTS,其中 HSTS 是 HTTP Strict Transport Security 的缩写,即:“HTTP严格传输安全”。HSTS的出现就是解决这些问题的。HSTS的作用除了节省HTTPS通信RT和强制使用HTTPS,还包括:

  • 阻止基于SSLStrip的中间人攻击;
  • 万一证书有错误,则显示错误,用户不能回避警告。

HSTS的具体工作机制可描述如下:服务器端配置支持HSTS后,会在给客户端返回的HTTP首部中携带HSTS字段。客户端获取到该信息后,会将所有HTTP访问请求在内部做307跳转到HTTPS,整个过程而无需任何网络过程,也就是直接实现第一次TCP握手开始就是HTTPS通信。

但是HSTS是有缺陷的,如第一次访问网站的客户端,HSTS并不工作。 要解决这个问题,就要了解我们下面要讲解的HSTS preload list。

HSTS preload list

HSTS preload list是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也在采用这个列表。

其中更多关于如何申请加入 HSTS preload list,可以参考我的文章《启用HSTS和申请HSTS Preload List》,申请加入之后,就可以避免HSTS的缺陷,解决第一次访问网站的客户端HSTS不工作的问题。

最后的最后,还是提醒一下,如果真不打算长期使用HTTPS的情况下,还是不建议启用HSTS。

参考

  • en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
  • blog.wilddog.com/?p=997
已有 7 条评论
  1. Finale

    我申请的时候出现warnning:
    Warning: Unnecessary HSTS header over HTTP
    The HTTP page at sends an HSTS header. This has no effect over HTTP, and should be removed.
    这是咋回事呢?

    Finale 回复
    1. Chakhsu Lau

      意思是 你得先开启HTTPS

      Chakhsu Lau 回复
      1. ok

        OK了谢谢

        ok 回复
  2. yyyyyyyhb

    HSTS还是有点不方便的,我做的HSTS是根域名,然后一弄子域名就要去弄个SSL证书

    yyyyyyyhb 回复
    1. Chakhsu Lau

      额,是,一旦开启不能回头了····· 如果子域名不想能HTTPS,那么在设置HSTS的时候就不要包括includeSubDomains,即可

      Chakhsu Lau 回复
  3. test

    测试一下~ 谢谢~

    test 回复
    1. Chakhsu

      。。。。。,

      Chakhsu 回复
发表新评论