HTTPS/TLS 连接初始化

HTTPS/TLS Connection Initialization

我一直在使用 Wireshark,我注意到某些网站在初始化 https 连接时表现不同。我测试的第一个网站是美国银行,当我在地址栏中输入 "bankofamerica.com" 时,它的表现完全符合我的预期。

控制流程如下:

  1. 发送 DNS 请求
  2. 通过端口 80 建立 TCP 连接(TCP 握手)
  3. 发送 GET / HTTP/1.1
  4. 接收 301 永久移动到 https://www.bankofamerica.com
  5. 通过 443 建立 TCP 连接
  6. 设置TLS并发送数据

这正是我所期望的。但是,当我在地址栏中输入 "facebook.com" 时,出现了以下情况:

  1. 发送 DNS 请求
  2. 通过端口 443 建立 TCP 连接
  3. 设置TLS并发送数据

即使我没有在地址栏中指定 HTTPS,连接怎么可能跳过 HTTP 请求?我已经尝试清除我的浏览器缓存,重置我的路由器,甚至查看 DNS RFC 以查看是否有一些 "https only" 标志(如我所料,没有)。

当我使用 netcat 时,我能够生成 301 永久移动(但是它是 http://www. NOT https://www。):

nc facebook.com 80\n
GET / HTTP/1.0\n\n

但我不知道它是如何(甚至在删除我的缓存之后)跳过浏览器连接中的 http 部分的。我担心我不了解 http/https 工作原理的基本部分。任何帮助将不胜感激。

谢谢

最可能的原因是您在过去某个时间使用该浏览器访问过 Facebook,并且 Facebook 服务器返回了 HTTP 严格传输安全 (HSTS) header.

一旦网站返回设置了 Strict-Transport-Security 的响应,浏览器将始终直接转到 HTTPS,即使您在浏览器中使用 http:// 前缀也是如此。我在自己的私人网站上试验 HSTS 时发现了这一点,发现很难让某些浏览器(我正在看你的是 Firefox)在设置后删除 HSTS 设置。