使用TLS/SSL (HTTPS)加密时,所有url都加密了吗?我想知道,因为我想在使用TLS/SSL (HTTPS)时隐藏所有URL数据。
如果TLS/SSL提供了URL的全部加密,那么我就不必担心从URL中隐藏机密信息。
使用TLS/SSL (HTTPS)加密时,所有url都加密了吗?我想知道,因为我想在使用TLS/SSL (HTTPS)时隐藏所有URL数据。
如果TLS/SSL提供了URL的全部加密,那么我就不必担心从URL中隐藏机密信息。
当前回答
既然没人提供电汇,那就来一个。 服务器名(URL的域部分)在ClientHello包中以纯文本形式呈现。
下面显示了一个浏览器请求: https://i.stack.imgur.com/path/?some=parameters&go=here
有关TLS版本字段的更多信息,请参阅这个答案(有3个-不是版本,每个字段包含版本号!)
从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层)。some=parameters&go=here HTTP/1.1 HTTP请求,安全TLS通道建立后。
执行概要
域名可以清晰传输(如果在TLS握手中使用SNI扩展),但URL(路径和参数)始终是加密的。
2019年3月更新
谢谢你,carlin。斯科特,谢谢你提起这件事。
SNI扩展中的有效载荷现在可以通过RFC提案草案进行加密。此功能仅存在于TLS 1.3中(作为一个选项,由两端实现),并且不向后兼容TLS 1.2及以下版本。
CloudFlare正在做这件事,你可以在这里阅读更多关于内部的信息 如果先有鸡后有蛋,你会把鸡放在哪里?
实际上,这意味着FQDN不再以纯文本形式传输(如Wireshark捕获的内容所示),而是被加密了。
注意:这解决了隐私方面的问题,而不是安全方面的问题,因为反向DNS查找可能会暴露预期的目标主机。
2020年9月更新
现在有一个RFC草案,用于加密整个客户端Hello消息,而不仅仅是SNI部分: https://datatracker.ietf.org/doc/draft-ietf-tls-esni/?include_text=1
在撰写本文时,浏览器的支持非常有限。
其他回答
链接到我对重复问题的回答。URL不仅在浏览器历史记录中可用,服务器端日志也可以作为HTTP Referer头发送,如果您使用第三方内容,则会将URL暴露给您控制之外的来源。
整个请求和响应都是加密的,包括URL。
请注意,当你使用HTTP代理时,它知道目标服务器的地址(域),但不知道该服务器上的请求路径(即请求和响应始终是加密的)。
虽然这里已经有了一些好的答案,但大多数都集中在浏览器导航方面。我在2018年写这篇文章,可能有人想知道移动应用程序的安全性。
对于移动应用程序,如果你控制应用程序的两端(服务器和应用程序),只要你使用HTTPS,你就是安全的。iOS或Android将验证证书并减轻可能的MiM攻击(这将是所有这一切中唯一的弱点)。您可以通过HTTPS连接发送敏感数据,这些数据将在传输过程中被加密。只有你的应用程序和服务器会知道通过https发送的任何参数。
这里唯一的“可能”是客户端或服务器感染了恶意软件,可以在数据被包装成https之前看到数据。但如果有人感染了这种软件,他们就可以访问数据,不管你用什么来传输数据。
Marc Novakowski的回答很有帮助——URL存储在服务器的日志中(例如,在/etc/httpd/logs/ssl_access_log中),所以如果你不想让服务器长期保存这些信息,就不要把它放在URL中。
我同意前面的答案:
明确地说:
使用TLS, URL的第一部分(https://www.example.com/)在构建连接时仍然可见。第二部分(/herearemygetparameters/1/2/3/4)由TLS保护。
然而,您不应该在GET请求中放置参数的原因有很多。
首先,正如其他人已经提到的: -通过浏览器地址栏泄露 -历史泄漏
除此之外,您还会通过http引用器泄漏URL:用户在TLS上看到站点A,然后单击到站点B的链接。如果两个站点都在TLS上,则对站点B的请求将在请求的引用器参数中包含来自站点A的完整URL。站点B的管理员可以从服务器B的日志文件中检索它。)