1

我一直在玩 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”标志(如我所料,没有)。

当我使用 netcat 时,我能够生成 301 Moved Permanently (但是它是http://www。不是https://www 。):

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

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

谢谢

4

1 回答 1

1

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

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

于 2015-11-11T14:18:43.013 回答