首次连接时 HTTPS URL 是纯文本格式吗?

信息安全 tls http 网址
2021-09-02 21:01:34

假设我从未连接到该站点example.com

如果此站点是 https 并且我写https://example.com/supersecretpage了 URL 是否会以明文形式发送,因为这是我第一次连接到该站点,因此尚未交换加密密钥?如果不是,什么时候发生?当我键入该 URL 时,谁能解释这些步骤?

3个回答

简短回答:不,URL 是加密的,但(子)域是以纯文本形式发送的。 在您的情况下,(被动)攻击者知道您正在连接到example.com,但它不知道您正在访问哪个特定页面。

简而言之,攻击者可以在 3 次情况下获取有关您正在访问的站点的信息(按时间顺序排列):

  1. DNS 查询中的(子)域
  2. 客户端 Hello (SNI) 中的(子)域
  3. 服务器证书中的(子)域

但是,那...

  1. URL 通过 TLS 加密发送

有关更多详细信息,请阅读下面的说明。

解释

注意:当我写“(子)域”时,我指的是域(example.com)和子域(mydomain.example.com)。当我只写“域”时,我真的只指example.com没有子域的域 ( )。

基本上发生的事情是:

  1. 您输入https://example.com/supersecretpage
  2. 浏览器以特殊的 TLS 扩展(称为SNI提交(子)域
  3. 在某些时候,浏览器会从服务器获取SSL 证书
    根据证书*,这还包括您要连接的子域,它也可能包括多个子域,甚至多个域。所以实际上 certexample.com还可能包括www.example.com,devserver.example.comhow-to-develop-tls.example. 这些条目称为主题备用名称,证书对所有条目均有效。
  4. 在客户端验证证书并且客户端和服务器选择密码后,流量被加密
  5. 在这一切发生之后,发送一个“通常的”HTTP 请求(通过安全的 TLS 通道)。这意味着这是整个请求中第一次出现完整的 URL请求例如如下所示:

    GET /supersecretpage HTTP/1.1
    主机:example.com
    [...]

* 如果证书是通配符证书,它不包括子域,而只是*.example.com.

另一件值得一提的事情是:在建立连接之前,客户端需要解析 DNS 名称。为此,它会将未加密的DNS 查询发送到 DNS 服务器,这些查询还包含(子)域,因此攻击者可以使用它来查看访问的域。


但是,这并不总是必须以这种方式发生,因为您假设用户手动输入https://example.com/supersecretpage到 URL 栏中。但这非常罕见,因为大多数用户宁愿输入example.com/supersecretpage. 另一个问题是访问者点击不安全的链接,它使用 HTTP - 与安全的 HTTPS 链接相反)。例如,此类链接可能是在站点不支持 HTTPS 或默认情况下未重定向到 HTTPS 时创建的旧链接。你问为什么这很重要?

在这种(通常)情况下https://,URL 中没有。当没有在 URL 栏中输入协议时,所有浏览器都会在内部将此 URL“转换”为http://example.com/supersecretpage(注意那里的http://),因为它们不能期望服务器支持 HTTPS。这意味着浏览器首先尝试使用不安全的 HTTP 连接到网站,并且只有在网站向 HTTPS URL 发送 (301) 重定向后,它才会使用安全模式。
在这种情况下,攻击者可以在未加密的 HTTP 请求中看到完整的 URL

您可以通过查看浏览器的“网络面板”轻松地自行测试。在那里你应该看到这个“HTTPS 升级”:
Firefox 中的 HTTPS 连接升级

但是请注意,有一些技术可以防止这种不安全的第一个 HTTP 请求。最值得注意的是HSTS和 - 为了保护您与网站建立的第一个连接 - HSTS 预加载,而且HTTPS Everywhere也 有助于抵御此类攻击。仅供参考:根据 Netcraft的数据,截至 2016 年 3 月,所有易受攻击的 HTTPS 服务器中有 95% 容易受到此类(SSL 剥离)攻击。

不,不会以明文形式发送 URL。

TCP 三向握手完成后,您的客户端立即启动与服务器的 TLS 协商。只有在协商完成并且加密到位后,才会发送 HTTP 请求。

由于您从未访问过网站 www.example.com,因此您的浏览器需要将域名解析为 IP 地址。因此,它会发出一个 DNS 解析查询,其中包含您尝试连接的站点的域名。因此,除非您使用安全 DNS,否则 MITM 可以找出您尝试连接的域。