之前的文章《启用HSTS和申请HSTS Preload List》可能对一些概念解析得不是很好,也让人觉得多此一举,其实更多的是看自己的需求。这里再次重新整理,让更多人对HSTS有更好的了解,也算是对自己的一次知识深度的加强。
HSTS是HTTPS性能和安全优化中最重要的一环,能够给HTTPS带来巨大好处,但也存在一个小缺陷。本篇文章会介绍HSTS的工作原理及如何通过HSTS preload list解决HSTS的小缺陷。
什么是HSTS?
在介绍HSTS之前,先来看看最典型的用户访问过程:
首先假设要访问的网站是全站HTTPS但未开启HSTS
- 一般地,用户在客户端访问一个网站的时候,往往只输入域名,而不带有协议名。例如访问我的博客www.linpx.com,而不是https://www.linpx.com。
- 输入www.linpx.com访问,客户端与服务器来一次TCP三次握手,建立连接;
- 然后做301/302跳转到HTTPS;
- 客户端与服务器再来一次TCP握手,重新建连;
- 然后开始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
本文由 Chakhsu Lau 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。
我申请的时候出现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.
这是咋回事呢?
意思是 你得先开启HTTPS
OK了谢谢
HSTS还是有点不方便的,我做的HSTS是根域名,然后一弄子域名就要去弄个SSL证书
额,是,一旦开启不能回头了····· 如果子域名不想能HTTPS,那么在设置HSTS的时候就不要包括includeSubDomains,即可
测试一下~ 谢谢~
。。。。。,