对阮一峰的《科技爱好者周刊(第 274 期):加密通信的最后一块拼图 》中 ECH 相关错误的修正

对阮一峰的《科技爱好者周刊(第 274 期):加密通信的最后一块拼图 》中 ECH 相关错误的修正

Nahida🍃

这篇文章中关于 ECH 的描述:

我先问大家,HTTPS 链接是加密通信吗?
你可以说它是,因为通信内容确实是加密的,外界无法窥测和篡改。
但是,它又不是彻底的加密通信,有一个地方是不加密的,那就是域名。中间人可以看到,你访问什么网站。
为什么域名不加密呢?
因为加密的密钥放在服务器上,而服务器只有知道域名,才知道发送哪一把密钥。所以,密钥的发送,必须在知道域名之后。
Cloudflare 解决的就是这个问题,它发明了一种新技术,叫做 ECH。
如果 cloudflare-ech.com 发生故障,或者种种原因无法访问,那么所有 Cloudflare 托管的网站是否都无法访问?
这是很现实的问题,因为 Cloudflare 是世界最大 CDN 服务商,很多网站都放在上面。而且,它对免费用户都启用了 ECH,还无法关闭(这是付费功能),等于是让免费用户当小白鼠。
我今天写这个话题,就是想提醒大家。如果由于 ECH 的问题,托管在 Cloudflare 的网站无法访问,有两个解决办法。
一个是站长向 Cloudflare 付费,关了 ECH;另一个是访问者不要使用加密 DNS,因为 ECH 依赖加密 DNS,没有了它,就不会触发 ECH


省流:


1. “如果 cloudflare-ech.com 发生故障,或者种种原因无法访问,那么所有 Cloudflare 托管的网站是否都无法访问” 是错误的。如果仅仅是该域名发生故障,而 Cloudflare 的 CDN 和其他服务正常运行,那么客户端会回退到传统的(Non-ECH) TLS 握手。

2. “ECH 依赖加密 DNS” 是错误的。规范并不强制要求加密 DNS。


以访问 e-hentai.org 为例, cloudflare-ech.com 单点故障会发生什么:

(以下部分内容由 AI 生成,并经过本人确认,目标域名仅为举例,不代表其真的支持 ECH)


当用户访问启用了 ECH 的 e-hentai.org,并且该网站托管在 Cloudflare 上时,以下是模拟的 TLS 握手过程:


1. 客户端向服务器发送 ClientHello:

  - 客户端生成 ClientHelloInner,其中包含真正的 SNI(`e-hentai.org`)。

  - 客户端生成 ClientHelloOuter,并在其中使用伪造的 SNI(`cloudflare-ech.com`)。

  - 客户端将 ClientHelloInner 加密为 Encrypted ClientHello (ECH)。

  - 客户端发送包含 ClientHelloOuter 和 ECH 的完整 ClientHello 消息到服务器。

2. Cloudflare 服务器收到 ClientHello:

  - 服务器尝试解密 ECH 以获取 ClientHelloInner。

  - 如果服务器能够成功解密 ECH(意味着它有正确的 ECH 配置),它会使用 ClientHelloInner 中的信息继续握手。

  - 如果服务器不能解密 ECH,它会使用 ClientHelloOuter 中的信息。

3. 如果 cloudflare-ech.com 发生故障:

  - 当 Cloudflare 服务器尝试使用 ClientHelloOuter 的 cloudflare-ech.com SNI 时,它可能会意识到这个 “伪” 域名当前有问题。

  - 在这种情况下,服务器可能会返回一个错误,或者更有可能的是,服务器会返回一个公告,说明当前 ECH 不能使用,并建议客户端退回到传统的 TLS 握手。

  - 当 ECH 握手超时的时候,客户端也会回退到传统 TLS 握手。

4. 客户端收到公告或错误:

  - 客户端会重新开始握手,这次不使用 ECH。

  - 客户端发送一个传统的 ClientHello,其中 SNI 明文设置为 e-hentai.org。

5. 完成握手:

  - 服务器现在可以明确知道客户端想要访问的是 e-hentai.org。

  - 服务器回应标准的 ServerHello,并继续进行握手过程。

  - 一旦握手完成,客户端和服务器就可以开始加密通信。


在整个过程中,客户端和服务器都有机会在握手失败时回退到传统的 TLS 握手,确保连接仍然可以建立,尽管 ECH 没有成功。


关于加密 DNS 和 ECH 的关系:


ECH 本身并不强制要求使用加密 DNS(DoH/DoT)。如果仅使用 ECH 而不使用加密 DNS,虽然 SNI 信息在 TLS 握手中是加密的,但 DNS 查询中的域名仍然是可见的。这意味着网络中的监听者(如 ISP 或中间人)仍然可以看到用户正在尝试访问哪个域名,尽管他们无法从 TLS 握手中看到这些信息。


因此,为了完整的隐私保护,建议同时使用 ECH 和加密 DNS。但 ECH 本身并不强制这一点。对于部分实现,例如 Firefox,强制要求启动 DoH 才允许 ECH,并非规范要求。


对于使用代理或自建 DNS 服务器的情况,在网关后使用 UDP 明文 DNS 不会对安全产生影响,例如 AdGuard Home DNS, SmartDNS, 配置得当的 OpenClash 等,可以在所有上游均为受信任的加密 DNS 的情况下保证隐私。

Report Page