HTTPS URL是否已加密?

Dan*_*nos 952 ssl https httprequest

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

如果TLS/SSL为您提供全面的URL加密,那么我不必担心从URL隐藏机密信息.

Mar*_*ski 865

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

  • 值得注意的是@Jalf在关于问题本身的评论中提到的事情.URL数据也将保存在浏览器的历史记录中,这可能是长期不安全的. (93认同)
  • 但请注意,URL的DNS解析可能未加密.因此,有人嗅探您的流量可能仍然可能会看到您尝试访问的域. (23认同)
  • 不只是GET或POST.也可以是DELETE,PUT,HEAD或TRACE. (19认同)
  • SNI打破了URL加密的"主机"部分.你可以用wireshark自己测试一下.有一个SNI选择器,或者您可以在连接到远程主机时查看SSL数据包. (18认同)
  • 是的,它可能是浏览器历史记录的安全问题.但在我的情况下,我不使用浏览器(原来的帖子也没有提到浏览器).在本机应用程序中使用幕后自定义https调用.这是确保应用程序的服务器连接安全的简单解决方案. (2认同)
  • 这个答案具有误导性。URL 被加密并不意味着所有详细信息都被隐藏。域名仍然可见 (2认同)

evi*_*obu 559

由于没有人提供线捕获,这里是一个.
服务器名称(URL的域部分)ClientHello纯文本形式显示在数据包中.

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

ClientHello SNI 有关 TLS版本字段的更多信息,请参阅此答案(其中有3个 - 不是版本,每个字段都包含版本号!)

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

3.1.服务器名称指示

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

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


简而言之:

  • FQDN(URL的域部分)可能被发送以明文内部ClientHello分组如果使用SNI扩展

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


执行摘要

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

  • 完美的答案,从A到Z的完整解释.我喜欢执行摘要.让我的一天成为@evilSnobu (30认同)
  • 完美的答案,upvote!仍然考虑客户端部分,因为浏览器历史可能是泄漏.但是,关于传输层,URL参数是加密的. (3认同)
  • 您可能想用TLS 1.3加密SNI扩展名的事实来更新此答案,而最大的CDN就是这样做的:https://blog.cloudflare.com/encrypted-sni/当然,数据包嗅探器可以做到反向DNS查找您要连接的IP地址。 (2认同)

Zac*_*ena 154

正如其他 答案已经指出的那样,https"URL"确实是加密的.但是,您在解析域名时的DNS请求/响应可能不是,当然,如果您使用的是浏览器,您的URL也可能被记录下来.

  • 并且URL记录很重要,因为有Javascript黑客允许完全不相关的网站测试给定的URL是否在您的历史记录中.您可以通过在其中包含一个长的随机字符串来创建一个不可思议的URL,但如果它是一个公共URL,则攻击者可以告诉它已被访问过,如果它有一个短信,那么攻击者就可以强行攻击以合理的速度. (21认同)
  • @SteveJessop,请提供*"Javascript hacks的链接,允许完全不相关的网站测试给定的URL是否在您的历史记录中"* (8认同)
  • @Pacerier:当然是黑客攻击日期,但当时我所谈论的内容是/sf/ask/167642331/没有检查的吧.在2010年这是一个很大的问题,这些问题正在被调查,攻击得到了改进,但我现在并没有真正关注它. (6认同)
  • @Pacerier:更多例子:http://webdevwonders.com/use-http-status-code-to-check-facebook-login-status/,http://webdevwonders.com/use-iframe-in-scrollable-div -to-读取浏览历史/ (2认同)

Pet*_*aný 99

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

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


小智 93

我同意以前的答案:

要明确:

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

但是,为什么不应该在GET请求中放置参数有很多原因.

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

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

  • @EJP,由于所有现代网络浏览器都使用的[SNI](https://en.wikipedia.org/wiki/Server_Name_Indication),域名可见.另请参阅EFF的[this diagram](https://www.eff.org/files/tor-https-1.png),表明任何人都可以看到您正在访问的网站的域名.这与浏览器可见性无关.这是关于窃听者可见的内容. (9认同)
  • @trusktr:浏览器不应该从HTTPS页面发送Referer标头.这是[HTTP规范的一部分](https://tools.ietf.org/html/rfc2616#section-15.1.3). (9认同)
  • @MartinGeisler,关键字是"应该".浏览器并不太关心"应该"(而不是"必须").从您自己的链接:*"强烈建议用户能够选择是否发送Referer字段.例如,浏览器客户端可以有一个切换开关用于公开/匿名浏览,这将分别**启用**/禁用发送Referer和From信息"*.Ops,这正是Chrome所做的.即使您处于隐身模式**,Chrome也会泄漏推荐人**. (7认同)
  • @EJP你不明白Tobias在说什么.他说如果你点击网站A上的链接将你带到网站B,那么网站B将获得引荐来源网址.例如,如果您访问http://siteA.com?u=username&pw=123123,则siteB.com(链接到siteA.com页面)将收到"http://siteA.com?u" = username&pw = 123123"作为引用URL,由浏览器发送到HTTPS内的siteB.com.如果这是真的,那就非常糟糕.这是真正的托比亚斯吗? (3认同)

小智 46

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


Soa*_*Box 30

是的,不是.

服务器地址部分未加密,因为它用于设置连接.

这可能会在未来使用加密的SNI和DNS进行更改,但截至2018年,两种技术都不常用.

路径,查询字符串等是加密的.

请注意,对于GET请求,用户仍然可以将URL剪切并粘贴到位置栏之外,您可能不希望将机密信息放在那里,任何看到屏幕的人都可以看到.

  • 想要+1这个,但我发现"是和否"误导 - 你应该改变它只是指出服务器名称将使用DNS解决而不加密. (8认同)
  • 根据我的理解,OP在正确的意义上使用URL这个词.我认为这个答案更具误导性,因为它没有明确区分URL中的主机名和DNS解析中的主机名. (7认同)
  • @EJP,@ trusktr,@ Lawrence,@ Guillaume.你们所有人都错了.**这与DNS无关.**SNI"[发送虚拟域名作为TLS协商的一部分](https://en.wikipedia.org/wiki/Server_Name_Indication#How_SNI_fixes_the_problem)",所以甚至如果您不使用DNS或DNS已加密,则嗅探器仍然可以看到您的请求的主机名**. (5认同)
  • URL已加密.HTTP事务的每个方面都是加密的.不仅仅是"其他一切".期.-1. (4认同)
  • @EJP但DNS查找**确实**使用URL的一个部分,因此对于非技术人员,整个URL不加密.仅仅使用Google.com查找非技术性内容的非技术人员不知道数据最终位于何处或如何处理.该域是用户访问的URL的一部分,并非100%加密,因为我作为攻击者可以嗅探他正在访问的站点.只有URL的/ path固有地加密给外行(这无关紧要). (4认同)
  • 差异是......? (2认同)
  • 这不是HTTPS交易的一部分,与您在此处继续给出的误导性印象相反. (2认同)

Nic*_*net 12

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

在此处输入图片说明

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

因此,看起来 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 服务对于想要确保咖啡店老板不会记录人们访问的网站列表的人来说仍然很有用。

  • 显然当前的 Firefox *可以*执行 ESNI,但默认情况下它是禁用的:您需要启用 `network.security.esni.enabled`,将 `network.trr.mode` 设置为 2(当前将您的 DoH 解析器设置为 CloudFlare),并重新启动浏览器(原文如此!);然后它将使用 ESNI - 在域基础设施的支持下。有关详细信息,请参阅 https://blog.mozilla.org/security/2018/10/18/encrypted-sni-comes-to-firefox-nightly/。 (2认同)

pbh*_*bhj 8

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

一般来说,其他答案是正确的,但实际上这篇论文表明访问的页面(即URL)可以非常有效地确定.

  • 根据我的引用:"我们针对超过6000个网页提供流量分析攻击,这些网页涵盖了医疗保健,金融,法律服务和流媒体视频等10个广泛使用的行业领先网站的HTTPS部署.我们的攻击识别了同一个网站,准确度为89%[...].看来你的可行性结论是错误的. (5认同)
  • 对于有兴趣阅读更多关于此类漏洞的人来说,这些类型的攻击通常被称为[旁道攻击](https://en.wikipedia.org/wiki/Side-channel_attack). (2认同)

ped*_*o91 8

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

简而言之:使用 HTTPS 隐藏:

  • HTTP方式
  • 查询参数
  • POST 正文(如果存在)
  • 请求标头(包括 cookie)
  • 状态码


Jos*_*rke 6

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

  • 它将使用第三方证书加密,以便他们可以看到 URL (3认同)

小智 5

您也不能总是依靠完整URL的私密性。例如,有时在企业网络中,像公司PC这样的提供的设备都配置了额外的“受信任”根证书,以便您的浏览器可以安静地信任对HTTPS流量的代理(中间人)检查。这意味着公开了完整的URL供检查。通常将其保存到日志中。

此外,您的密码也会被公开并可能被记录下来,这是使用一次性密码或经常更改密码的另一个原因。

最后,如果未进行其他加密,则请求和响应内容也将公开。

Checkpoint此处介绍了一种检查设置的示例。也可以通过这种方式设置使用提供的PC的老式“网吧”。


Ric*_*Web 5

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

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

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