我对HSTS的一些小了解

in Tutorials with 7 comments

之前的文章《启用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
            |                           |
            |                           |
            +                           +

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

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

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。

参考

Responses
  1. 我申请的时候出现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.
    这是咋回事呢?

    Reply
    1. @Finale

      意思是 你得先开启HTTPS

      Reply
      1. ok ok
        @Chakhsu Lau

        OK了谢谢

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

    Reply
    1. @yyyyyyyhb

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

      Reply
  3. test test

    测试一下~ 谢谢~

    Reply
    1. @test

      。。。。。,

      Reply