ChatGPT解决这个技术问题 Extra ChatGPT

HTTPS URL 是否加密?

使用 TLS/SSL (HTTPS) 加密时是否对所有 URL 进行了加密?我想知道,因为我希望在使用 TLS/SSL (HTTPS) 时隐藏所有 URL 数据。

如果 TLS/SSL 为您提供完整的 URL 加密,那么我不必担心隐藏 URL 中的机密信息。

无论如何,将机密数据放在 URL 中可能是个坏主意。它也会在浏览器中显示不好的地址,记得吗?如果碰巧瞥一眼屏幕的任何人都可以看到他们的密码,那么人们会不喜欢它。为什么您认为需要在 URL 中放入机密数据?
URL 也存储在浏览器历史记录和服务器日志中 - 如果我想将我的姓名和密码存储在某个地方,它不会在这两个地方。
例如,假设我访问 https://somewhere_i_trust/ways_to_protest_against_the_government/。然后 URL 包含机密数据,即我正在考虑抗议我的政府的建议。
从本机(不是基于浏览器的)应用程序发出 HTTP 请求时,我问自己这个问题。我猜这可能会让移动应用程序开发人员感兴趣。在这种情况下,上面的评论(虽然是真的)是无关紧要的(没有可见的 url,没有浏览历史),据我所知,答案很简单:“是的,它是加密的”。
对于那些认为一旦你是 HTTPS 就没有人知道你要去哪里的人,首先阅读这个:服务器的主机名(例如 example.com)仍然会因为 {1 而泄露}。这与 DNS 完全无关,即使您不使用 DNS 或使用加密 DNS,也会发生泄漏。

m
matteo

是的,SSL 连接位于 TCP 层和 HTTP 层之间。客户端和服务器首先建立一个安全的加密 TCP 连接(通过 SSL/TLS 协议),然后客户端将通过该加密的 TCP 连接发送 HTTP 请求(GET、POST、DELETE...)。

Note however(也如评论中所述)URL 的 域名 部分在 TLS 协商的第一部分以明文形式发送。因此,可以嗅探服务器的域名。但不是 URL 的其余部分。


仍然值得注意@Jalf 在对问题本身的评论中提到的事情。 URL 数据也将保存在浏览器的历史记录中,这可能是不安全的长期。
不仅仅是 GET 或 POST。也可以是 DELETE、PUT、HEAD 或 TRACE。
是的,这可能是浏览器历史记录的安全问题。但就我而言,我没有使用浏览器(原始帖子也没有提到浏览器)。在本机应用程序的后台使用自定义 https 调用。这是确保应用程序的服务器连接安全的简单解决方案。
但是请注意,URL 的 DNS 解析可能未加密。因此,嗅探您的流量的人仍然可能会看到您尝试访问的域。
SNI 破坏了 URL 的 SSL 加密的“主机”部分。你可以用wireshark自己测试。有一个 SNI 选择器,或者您可以在连接到远程主机时查看您的 SSL 数据包。
C
Community

由于没有人提供线路捕获,因此这里提供了一个。
服务器名称(URL 的域部分)以纯文本 形式出现在 ClientHello 数据包中。

下面显示了一个浏览器请求:
https://i.stack.imgur.com/path/?some=parameters&go=here

https://i.stack.imgur.com/rdHZZ.png

https://www.ietf.org/rfc/rfc3546.txt

3.1。服务器名称指示 [TLS] 没有为客户端提供一种机制来告诉服务器它正在联系的服务器的名称。客户端可能希望提供此信息以促进与在单个底层网络地址托管多个“虚拟”服务器的服务器的安全连接。

为了提供服务器名称,客户端可以在(扩展的)客户端 hello 中包含类型为“server_name”的扩展。

简而言之:

如果使用 SNI 扩展,FQDN(URL 的域部分)可以在 ClientHello 数据包中以明文形式传输

URL 的其余部分(/path/?some=parameters&go=here)在 ClientHello 内部没有任何业务,因为请求 URL 是 HTTP 事物(OSI 第 7 层),因此它永远不会出现在 TLS 握手(第 4 层或5)。这将在 GET /path/?some=parameters&go=here HTTP/1.1 HTTP 请求中稍后出现,在建立安全 TLS 通道之后。

执行摘要

域名可以明文传输(如果在 TLS 握手中使用 SNI 扩展),但 URL(路径和参数)始终是加密的。

2019 年 3 月更新

感谢carlin.scott提出这个问题。

现在可以通过 this draft RFC proposal 加密 SNI 扩展中的负载。此功能仅存在于 TLS 1.3 中(作为一个选项,由两端来实现)并且与 TLS 1.2 及更低版本没有向后兼容性。

CloudFlare 正在这样做,您可以在此处阅读有关内部结构的更多信息 — If the chicken must come before the egg, where do you put the chicken?

在实践中,这意味着现在不是以纯文本形式传输 FQDN(如 Wireshark 捕获节目),而是对其进行加密。

注意:这解决了隐私方面的问题,而不是安全方面的问题,因为反向 DNS 查找可能无论如何都会显示预期的目标主机。

2020 年 9 月更新

现在有一个用于加密整个 Client Hello 消息的 RFC 草案,而不仅仅是 SNI 部分:https://datatracker.ietf.org/doc/draft-ietf-tls-esni/?include_text=1

在撰写此浏览器时,支持非常有限。


完美的答案,从头到尾都有完整的解释。我喜欢执行摘要。让我开心@evilSnobu
完美答案,点赞!仍然考虑客户端部分,因为浏览器历史记录可能是泄漏的。但是,关于传输层,URL 参数是加密的。
您可能希望使用 TLS 1.3 加密 SNI 扩展这一事实来更新此答案,而最大的 CDN 就是这样做的:blog.cloudflare.com/encrypted-sni 当然,数据包嗅探器可以对您的 IP 地址进行反向 dns 查找连接到。
@evilSnobu,但是 username:password@domain.com 的用户名:密码部分是加密的,对吗?因此使用 https 在 url 中传递敏感数据是安全的。
它们在线路上(在传输中)被加密,但是如果任一端(用户或服务器)将 URL 记录到纯文本文件并且不清理凭据......现在这是一个不同的对话。
C
Community

正如 other answers 已经指出的那样,https“URL”确实是加密的。但是,您在解析域名时的 DNS 请求/响应可能不是,当然,如果您使用的是浏览器,您的 URL 也可能会被记录。


URL 记录很重要,因为有 Javascript 黑客可以让完全不相关的网站测试给定的 URL 是否在您的历史记录中。您可以通过在其中包含一个较长的随机字符串来使 URL 不可猜测,但如果它是一个公共 URL,那么攻击者可以判断它已被访问,如果它有一个简短的秘密,那么攻击者可以暴力破解以合理的速度。
@SteveJessop,请提供指向“允许完全不相关的网站测试给定 URL 是否在您的历史记录中的 Javascript hacks”的链接
@Pacerier:当然是黑客日期,但我当时谈论的是stackoverflow.com/questions/2394890/…之类的东西。早在 2010 年,对这些问题进行调查并改进攻击是一件大事,但我目前并没有真正关注它。
@Pacerier:更多示例:webdevwonders.com/…webdevwonders.com/…
您可以将 OpenDNS 与它的加密 DNS 服务一起使用。我在我的 Mac 上使用它,但我发现 Windows 版本无法正常工作。不过那是不久前的事了,所以现在可能可以正常工作了。对于 Linux,还没有。 opendns.com/about/innovations/dnscrypt
D
DanMan

整个请求和响应都是加密的,包括 URL。

请注意,当您使用 HTTP 代理时,它知道目标服务器的地址(域),但不知道该服务器上的请求路径(即请求和响应总是加密的)。


M
Mihai Maruseac

我同意前面的回答:

明确地说:

使用 TLS,URL 的第一部分 (https://www.example.com/) 在建立连接时仍然可见。第二部分(/hereemygetparameters/1/2/3/4)受 TLS 保护。

但是,有很多原因导致您不应该在 GET 请求中放入参数。

首先,正如其他人已经提到的: - 通过浏览器地址栏泄漏 - 通过历史记录泄漏

除此之外,您还通过 http 引用者泄漏了 URL:用户在 TLS 上看到站点 A,然后单击指向站点 B 的链接。如果两个站点都在 TLS 上,则对站点 B 的请求将包含来自站点 A 的完整 URL请求的referer参数。站点 B 的管理员可以从服务器 B 的日志文件中检索它。)


@EJP 你不明白托比亚斯在说什么。他的意思是,如果您单击站点 A 上的链接,该链接会将您带到站点 B,那么站点 B 将获得引荐来源网址。例如,如果您在 siteA.com?u=username&pw=123123,则 siteB.com(链接到 siteA.com 的页面上)将收到“siteA.com?u=username&pw=123123”作为引用 URL,由 HTTPS 在 HTTPS 内发送到 siteB.com浏览器。如果这是真的,那就太糟糕了。这是真的托拜厄斯吗?
@EJP,该域是可见的,因为所有现代网络浏览器都使用 SNI。另请参阅 EFF 中的 this diagram,表明任何人都可以看到您正在访问的站点的域。这与浏览器可见性无关。这是关于窃听者可见的内容。
@trusktr:浏览器不应从 HTTPS 页面发送 Referer 标头。这是part of the HTTP specification
@MartinGeisler,关键字是“应该”。浏览器不太关心“应该”(而不是“必须”)。来自您自己的链接:“强烈建议用户能够选择是否发送Referer字段。例如,浏览器客户端可以有一个用于公开/匿名浏览的切换开关,这将分别启用/禁用发送引用者和发件人信息”。 Ops,这正是 Chrome 所做的。即使您处于隐身模式,Chrome 也会泄露引荐来源网址。
m
mikemaccana

是和不是。

服务器地址部分未加密,因为它用于建立连接。

这可能会在未来随着加密的 SNI 和 DNS 而改变,但截至 2018 年,这两种技术都不常用。

路径、查询字符串等被加密。

请注意,对于 GET 请求,用户仍然可以从地址栏中剪切和粘贴 URL,并且您可能不希望在其中放置任何人都可以看到屏幕的机密信息。


想对此 +1,但我发现“是和否”具有误导性 - 您应该将其更改为仅指出服务器名称将使用 DNS 解析而不加密。
在我的理解中,OP 在正确的意义上使用了 URL 这个词。我认为这个答案更具误导性,因为它并没有明确区分 URL 中的主机名和 DNS 解析中的主机名。
URL 已加密。 HTTP 事务的每个方面都是加密的。不仅仅是“其他一切”。时期。 -1。
@EJP,但 DNS 查找确实使用了 URL 的某一部分,所以对于非技术人员来说,整个 URL 没有被加密。仅使用 Google.com 查找非技术性内容的非技术人员不知道数据最终位于何处或如何处理。域是用户正在访问的 URL 的一部分,它不是 100% 加密的,因为我作为攻击者可以嗅探他正在访问的站点。只有 URL 的 /path 对外行人来说是固有加密的(不管如何)。
@EJP,@​trusktr,@​劳伦斯,@​Guillaume。你们都误会了。 这与 DNS 无关。 SNI“send the name of the virtual domain as part of the TLS negotiation”,因此即使您不使用 DNS 或您的 DNS 已加密,嗅探器仍然可以看到主机名 您的请求。
R
Rhodri Cusack

Marc Novakowski 提供的有用答案的补充 - URL 存储在服务器上的日志中(例如,在 /etc/httpd/logs/ssl_access_log 中),因此如果您不希望服务器长时间维护信息术语,不要放在 URL 中。


N
Nicolas Guérinet

现在是 2019 年,TLS v1.3 已经发布。根据 Cloudflare,服务器名称指示(SNI 又名主机名)可以通过 TLS v1.3 进行加密。所以,我告诉自己很棒!让我们看看它在 cloudflare.com 的 TCP 数据包中的样子。因此,我从 cloudflare 服务器的响应中捕获了一个“client hello”握手数据包,使用 Google Chrome 作为浏览器,wireshark 作为数据包嗅探器。我仍然可以在客户端 hello 数据包中以纯文本格式读取主机名,如下所示。它没有加密。

https://i.stack.imgur.com/BZDy4.jpg

因此,请注意您可以阅读的内容,因为这仍然不是匿名连接。客户端和服务器之间的中间件应用程序可以记录客户端请求的每个域。

因此,看起来 SNI 的加密需要额外的实现才能与 TLSv1.3 一起工作

2020 年 6 月更新:看起来加密 SNI 是由浏览器启动的。 Cloudflare 有一个页面供您检查您的浏览器是否支持加密 SNI:

https://www.cloudflare.com/ssl/encrypted-sni/

在这一点上,我认为谷歌浏览器不支持它。您可以在 Firefox 中手动激活加密 SNI。当我出于某种原因尝试它时,它并没有立即起作用。在它工作之前我重新启动了两次 Firefox:

在 URL 字段中输入:about:config。

检查 network.security.esni.enabled 是否为真。清除缓存/重新启动

转到我之前提到的网站。

正如您所看到的,VPN 服务今天对于想要确保咖啡店老板不记录人们访问的网站列表的人来说仍然有用。


“SNI 可以被加密”——这是关键点。使用当前的 Google Chrome 检查 cloudflare.com/ssl/encrypted-sni 会显示“您的浏览器在访问此页面时未加密 SNI。”一个巴掌拍不响...
显然当前的 Firefox 可以 执行 ESNI,但默认情况下禁用:您需要启用 network.security.esni.enabled,将 network.trr.mode 设置为 2(当前将您的 DoH 解析器设置为 CloudFlare),然后重新启动浏览器(原文如此!);然后它将使用 ESNI - 由域的基础设施支持。有关详细信息,请参阅 blog.mozilla.org/security/2018/10/18/…
p
pbhj

监控流量的第三方也可以通过检查您的流量并将其与其他用户访问该站点时的流量进行比较来确定访问的页面。例如,如果一个站点上只有 2 个页面,其中一个比另一个大得多,那么比较数据传输的大小将知道您访问了哪个页面。有一些方法可以对第三方隐藏,但它们不是正常的服务器或浏览器行为。例如,参见 SciRate 的这篇论文,https://scirate.com/arxiv/1403.0297

一般来说,其他答案是正确的,尽管本文表明可以非常有效地确定访问的页面(即 URL)。


这实际上只在非常小的网站上可行,在这种情况下,网站的主题/色调/性质可能在每个页面上仍然大致相同。
从我给出的引文中:“我们对 6000 多个网页进行了流量分析攻击,这些网页跨越 10 个广泛使用的行业领先网站的 HTTPS 部署,这些网站在医疗保健、金融、法律服务和流媒体视频等领域。我们的攻击识别了同一个网站,准确率为 89% [...]”。您关于可行性的结论似乎是错误的。
对于有兴趣阅读有关此类漏洞的更多信息的任何人,这些类型的攻击通常称为 side-channel attacks
D
Don Gillis

您也不能总是指望完整 URL 的隐私。例如,在企业网络中有时会出现这种情况,提供的设备(例如您的公司 PC)配置有额外的“受信任”根证书,以便您的浏览器可以安静地信任对 https 流量的代理(中间人)检查.这意味着完整的 URL 被公开以供检查。这通常保存到日志中。

此外,您的密码也被公开并可能被记录,这是使用 one time passwords 或经常更改密码的另一个原因。

最后,如果没有加密,请求和响应内容也会暴露。

Checkpoint here 描述了检查设置的一个示例。使用提供的 PC 的老式“网吧”也可以这样设置。


C
Community

链接到我在 duplicate question 上的答案。 URL 不仅在浏览器历史记录和服务器端日志中可用,而且还作为 HTTP Referer 标头发送,如果您使用第三方内容,则会将 URL 暴露给您无法控制的来源。


提供您的第三方调用也是 HTTPS,尽管这不是问题,对吗?
它将使用第三方证书加密,因此他们可以看到 URL
R
Ricardo BRGWeb

尽管这里已经有一些很好的答案,但其中大多数都集中在浏览器导航上。我在 2018 年写这篇文章,可能有人想了解移动应用程序的安全性。

对于移动应用程序,如果您控制应用程序的两端(服务器和应用程序),只要您使用 HTTPS,您就很安全。 iOS 或 Android 将验证证书并减轻可能的 MiM 攻击(这将是所有这一切的唯一弱点)。您可以通过 HTTPS 连接发送敏感数据,这些数据将在传输过程中被加密。只有您的应用程序和服务器会知道通过 https 发送的任何参数。

这里唯一的“可能”是客户端或服务器是否感染了恶意软件,这些恶意软件可以在将数据包装在 https 中之前查看数据。但是,如果有人感染了这种软件,无论您使用什么来传输数据,他们都可以访问数据。


p
pedrorijo91

虽然您已经有了很好的答案,但我真的很喜欢这个网站上的解释:https://https.cio.gov/faq/#what-information-does-https-protect

简而言之:使用 HTTPS 隐藏:

HTTP方法

查询参数

POST 正文(如果存在)

请求标头(包括 cookie)

状态码


C
Chris Rutledge

此外,如果您正在构建一个 ReSTful API,浏览器泄漏和 http 引用问题大多会得到缓解,因为客户端可能不是浏览器并且您可能没有人点击链接。

如果是这种情况,我建议使用 oAuth2 登录来获取不记名令牌。在这种情况下,唯一的敏感数据将是初始凭据......无论如何这可能应该在发布请求中