ECH 是什么
ECH(Encrypted Client Hello)把 ClientHello 里最敏感的字段(首当其冲是 SNI)整体加密,只留一段不含目标域名的外层问候明文可见。密钥来自 DNS:域名的 HTTPS/SVCB 记录公布 ECH 配置(公钥与配置标识),客户端用它加密内层 ClientHello,服务端(常见是 CDN 边缘)持私钥解密。这样中间观察者只能看到客户端访问了某个 CDN,无法直接得知具体域名,抑制了基于 SNI 的流量分类与阻断。
基本信息
| 解决的问题 | TLS 1.3 中 SNI 仍以明文传输,暴露访问目标 |
|---|---|
| 实现方式 | 客户端用配置公钥加密内层 ClientHello,外层只暴露公共信息 |
| 前置条件 | DNS 的 HTTPS/SVCB 记录提供 ECH 配置,服务端支持并持有私钥 |
| 相关记录 | RFC 9460 定义的 SVCB/HTTPS 记录类型 |
| 现状 | 主流浏览器与部分 CDN 已支持,是否生效取决于部署版本 |
典型使用场景
- 隐私要求高的站点:不希望访问目标被中间网络直接观察。
- CDN 接入核对:确认边缘节点已下发 ECH 配置并正确解密内层问候。
- 排障对比:ECH 未生效时会回退明文 ClientHello,需要确认是回退而不是失败。
- DNS 配置审计:检查 HTTPS 记录是否随证书或密钥轮换及时更新。
- 合规与威胁建模:评估在现有网络环境下 ECH 能挡住哪一类观察者。
查看 ECH 相关配置
查看 ECH 相关配置
dig +short HTTPS example.com | head -3 # 看 SVCB/HTTPS 记录是否带 ech 参数
dig +short TYPE65 example.com | head -3 # 类型 65 即 HTTPS 记录的另一种查法
# 用支持的客户端抓包对比:开启后外层 ClientHello 不应再出现目标域名
# tshark -r ech.pcap -Y 'tls.handshake.extensions_server_name' -T fields -e tls.handshake.extensions_server_name观察点与判定
| 观察点 | ECH 生效 | 未生效或回退 |
|---|---|---|
| 外层 ClientHello 的 SNI | 不出现真实目标域名 | 直接出现目标域名 |
| DNS HTTPS 记录 | 带 ech 参数与公钥 | 无 ech 参数 |
| 握手结果 | 正常完成,内层字段不可见 | 客户端回退为普通明文握手 |
| 记录变化 | 配置轮换后公钥随之更新 | 记录长期不更新,可能与服务端不匹配 |
ECH 与此前的 ESNI 是不同代际方案,排障时以当前部署文档为准。未部署 ECH 不影响 HTTPS 本身的加密与身份认证能力,只是 SNI 对外可见。