HTTPS头部信息是否被加密?

773
在通过HTTPS发送数据时,我知道内容是加密的,但是我听到了一些关于头部是否加密以及头部加密的程度的混合答案。
HTTPS头部有多少被加密?
包括GET/POST请求URL、Cookies等。

21
HTTP头在HTTPS中是被加密的,即使内容本身已经被HTTP压缩过,HTTP头也不会再次被压缩。这使得它们比BEAST等压缩相关攻击更难受到威胁。 - Neil McGuigan
9个回答

696
所有HTTP头都是加密的。这就是为什么虚拟主机上的SSL不太有效——您需要专用IP地址,因为主机头是加密的。 如果使用TLS,则服务器名称识别(SNI)标准意味着主机名可能未加密。此外,无论是否使用SNI,TCP和IP头始终未加密。(如果它们被加密了,您的数据包将无法路由。)

4
@Greg,由于vhost网关经过授权,那么网关不能解密它们,观察主机头,并确定要将数据包发送到哪个主机吗? - Pacerier
3
据我所知,URL本身并没有加密。 - Teddy
9
@Teddu你所说的“URL本身未经加密”是什么意思?它是经过加密的,因为它是报头的一部分。 - Dmitry Polushkin
2
如果使用Fiddler来捕获https通信,它仍然会显示一些头信息,为什么?特别是当互联网连接通过需要身份验证的代理时,在第一次发送请求后重新发送请求时,它会显示Proxy-Authorization头。 - Bochen Lin
3
如果你和Pegasus一样使用相同的方式,那么如果你位于HTTPS隧道的任一端点,你就可以看到所有内容。就像我可以在浏览器开发工具中查看任何东西一样。 - Nux
显示剩余2条评论

131

标题头完全加密。通过网络传输的“明文”信息只涉及SSL设置和D/H密钥交换。此交换经过精心设计,不会向窃听者提供任何有用的信息,一旦交换完成,所有数据均被加密。


7
并非所有SSL设置都涉及DH。 - Dori
51
有点学究气:客户端和服务器的IP地址、服务器的主机名以及它们的SSL实现信号对窃听者很有用且可见。 - poolie

95

对于这个老问题,我想再补充一些意见。

楼主问的是头部是否加密。

当数据在传输时,它们是加密的。

但是当数据不在传输时,它们就没有被加密。

因此,您的浏览器URL(以及在某些情况下的标题)可以显示查询字符串(通常包含最敏感的细节)和头信息中的一些详细信息;浏览器了解一些头信息(内容类型、Unicode等);浏览器历史记录、密码管理、收藏夹/书签和缓存页面都将包含查询字符串。远程端的服务器日志也可能包含查询字符串以及一些内容详情。

此外,URL并不总是安全的:域名、协议和端口是可见的——否则路由器就不知道将您的请求发送到哪里。

此外,如果您使用HTTP代理,代理服务器会知道地址,但通常不知道完整的查询字符串。

因此,如果数据正在移动,则通常受到保护。如果数据不在传输中,则未加密。

不是要挑剔,但数据最终也会被解密,可以随意解析、读取、保存、转发或丢弃。此外,在任一端的恶意软件都可以拍摄进入(或退出)SSL协议的数据快照——例如,HTTPS内部页面中的(坏的)Javascript可以偷偷地向日志网站发出http(或https)调用(因为通常限制对本地硬盘的访问并不实用)。

此外,在HTTPS协议下,Cookie也没有被加密。希望在Cookie(或任何其他地方)存储敏感数据的开发人员需要使用自己的加密机制。

至于缓存,大多数现代浏览器不会缓存HTTPS页面,但这个事实并未由HTTPS协议定义,它完全取决于浏览器开发人员确保不缓存通过HTTPS接收的页面。

因此,如果您担心数据包嗅探,您可能没事了。但是,如果您担心恶意软件或有人查看您的历史记录、书签、Cookie或缓存,则还没有彻底解决问题。


40
我知道好的答案通常在顶部,但这再次插入了错误的信息。除非使用SNI,否则域是不可见的。除了IP和TCP之外的协议也是不可见的。你无法判断我是否正在使用HTTP 1.1、SPDY还是HTTP2。两个端点上可见的信息都是不相关的,因为加密的目的不是使事物隐形,而是使事物仅对受信任的方可见。因此,问题中已经暗示了端点,并且您答案的约2/3可以删除。代理信息应为:如果您使用HTTPS代理,则它确实可以访问所有内容 - user1600649
6
您的链接明确表示cookie是加密的:“访问者的连接是加密的,隐藏了URL、Cookie和其他敏感元数据。” - DylanYoung
1
是的,没错。Cookie在传输过程中是加密的,但一旦它们到达浏览器,就不会被SSL协议加密。开发人员可以加密cookie数据,但这超出了SSL的范围。 - Andrew Jay
5
@DylanYoung SSL = 安全套接字层;TLS = 传输层安全。加密是在套接字(连接)级别或换句话说,在传输级别上进行的,而不是在浏览器每个域数据库中存储时进行的。 - curiousguy
1
curiousguy:是的,我知道。答案说它们不是通过https(即ssl)加密的。但事实上它们是加密的。它们在浏览器中没有被加密。头部或任何内容也没有被加密(如果有加密,那么很容易解密)。 - DylanYoung
显示剩余2条评论

58

HTTP 1.1 版本新增了一种特殊的HTTP方法 CONNECT,旨在创建SSL隧道,包括必要的协议握手和加密设置。
之后所有的常规请求都会被包含在SSL隧道中发送,包括头部和正文。


CONNECT 何时用于创建 SSL 隧道? - curiousguy
@curiousguy https://tools.ietf.org/html/rfc7231#section-4.3.6 - avp

56

HTTPS (安全套接层上的HTTP) 将所有 HTTP 内容都发送到 SSL 通道中,因此 HTTP 内容和标头也被加密。


54
使用SSL时,加密是在传输层完成的,因此加密过程发生在请求发送之前。因此,请求中的所有内容都被加密了。

由于 SSL 发生在传输层,而分配目标地址的数据包(在头部中)发生在网络层(在传输层下面),那么头部是如何加密的呢? - Prateek Joshi
@PrateekJoshi 因为HTTP头部位于应用层,所以默认情况下是加密的,因为较低/祖先层被加密。 - Aquarelle

24

是的,头部信息也是被加密的。这里相关内容。

HTTPS消息中的所有内容都被加密,包括头部信息以及请求和响应内容。


71
维基百科不是规范,你应该引用的是规范。 - Aran Mulholland

12

URL也是加密的,实际上只有IP、端口和如果存在SNI,则主机名是未加密的。


即使不支持SNI,能够拦截HTTP连接的中间人通常也能够监视DNS查询(大多数拦截是在客户端附近进行的,例如在盗版用户路由器上)。因此,他们将能够看到DNS名称。 - curiousguy

2
为了理解什么是加密的,什么不是加密的,您需要知道SSL/TLS位于传输层和应用层之间。在HTTPS的情况下,HTTP是应用层,TCP是传输层。这意味着SSL级别以下的所有标头都未加密。此外,SSL本身可能会公开数据。公开的数据包括(对于每个层的标头):
注意:还可能公开其他数据,但这些数据很可能会被公开。
MAC:
1.源MAC地址(当前跳) 2.目标MAC地址(下一跳)
IP(假设为IPv4):
1.目标IP地址 2.源IP地址 3.IP选项(如果设置) 4.服务类型(TOS) 5.当前数据包通过的跳数(如果TTL设置为64)
TCP:
1.源端口 2.目标端口 3.TCP选项
理论上,可以加密TCP标头,但实现起来很困难。
SSL:
1.主机名(如果使用SNI)
通常,浏览器不会立即使用HTTPS连接到目标主机,而是有一些早期请求,这些请求可能会公开以下信息(如果您的客户端不是浏览器,则可能会表现得不同,但DNS请求非常常见):
DNS: 发送此请求以获取服务器的正确IP地址。它将包括主机名,其结果将包括属于服务器的所有IP地址。
HTTP: 向您的服务器发送的第一个请求。浏览器仅在受指示时使用SSL/TLS,首先使用未加密的HTTP。通常,这将导致重定向到安全站点。但是,此处可能已包含某些标头:
1.用户代理(客户端规范) 2.主机(主机名) 3.Accept-Language(用户语言)

MAC地址并不是真正“暴露”的,只有本地路由器才能看到客户端的MAC地址(它总是能够这样做),而目标MAC地址与最终服务器根本没有关系。相反,只有服务器的路由器才能看到服务器的MAC地址,那里的源MAC地址与客户端无关。 - Martheen
@Martheen 源地址设置为当前跳的 MAC 地址,目标地址设置为下一跳之一。它们取决于数据包捕获的位置,并不提供任何有用的信息。 - HelpfulHelper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接