假设我从未连接到该站点example.com
。
如果此站点是 https 并且我写https://example.com/supersecretpage
了 URL 是否会以明文形式发送,因为这是我第一次连接到该站点,因此尚未交换加密密钥?如果不是,什么时候发生?当我键入该 URL 时,谁能解释这些步骤?
假设我从未连接到该站点example.com
。
如果此站点是 https 并且我写https://example.com/supersecretpage
了 URL 是否会以明文形式发送,因为这是我第一次连接到该站点,因此尚未交换加密密钥?如果不是,什么时候发生?当我键入该 URL 时,谁能解释这些步骤?
简短回答:不,URL 是加密的,但(子)域是以纯文本形式发送的。
在您的情况下,(被动)攻击者知道您正在连接到example.com
,但它不知道您正在访问哪个特定页面。
简而言之,攻击者可以在 3 次情况下获取有关您正在访问的站点的信息(按时间顺序排列):
但是,那...
有关更多详细信息,请阅读下面的说明。
注意:当我写“(子)域”时,我指的是域(example.com
)和子域(mydomain.example.com
)。当我只写“域”时,我真的只指example.com
没有子域的域 ( )。
基本上发生的事情是:
example.com
还可能包括www.example.com
,devserver.example.com
和how-to-develop-tls.example
. 这些条目称为主题备用名称,证书对所有条目均有效。在这一切发生之后,发送一个“通常的”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 升级”:
但是请注意,有一些技术可以防止这种不安全的第一个 HTTP 请求。最值得注意的是HSTS和 - 为了保护您与网站建立的第一个连接 - HSTS 预加载,而且HTTPS Everywhere也 有助于抵御此类攻击。仅供参考:根据 Netcraft的数据,截至 2016 年 3 月,所有易受攻击的 HTTPS 服务器中有 95% 容易受到此类(SSL 剥离)攻击。
不,不会以明文形式发送 URL。
TCP 三向握手完成后,您的客户端立即启动与服务器的 TLS 协商。只有在协商完成并且加密到位后,才会发送 HTTP 请求。
由于您从未访问过网站 www.example.com,因此您的浏览器需要将域名解析为 IP 地址。因此,它会发出一个 DNS 解析查询,其中包含您尝试连接的站点的域名。因此,除非您使用安全 DNS,否则 MITM 可以找出您尝试连接的域。