ECH,新时代的域前置
字数 1294 2025-08-22 12:22:54
ECH技术详解:新时代的域前置技术
背景概述
传统修改HOST方式的域前置技术已被各大CDN厂商修复,CloudFlare推动并率先支持的ECH(Encrypted Client Hello)技术成为新的解决方案。ECH是TLS 1.3协议的扩展,旨在增强隐私保护,防护中间人攻击和流量分析。
ECH核心原理
传统TLS 1.3握手的问题
- 客户端支持的加密套件明文传输
- SNI(Server Name Indication)明文暴露
- 其他协议扩展字段未加密
ECH技术改进
- 加密整个ClientHello包
- 真正的ClientHello(ClientHelloInner)使用公钥加密
- 加密内容放入握手包的extension部分
- 流量设备只能看到虚假的ClientHelloOuter(包含虚假SNI)
ECH技术实现细节
公钥获取机制
- 公钥存储在DNS域名的HTTPS解析记录中
- 可通过dig命令查询:
dig +short research.cloudflare.com TYPE65
ECH DNS记录解析
支持ECH的域名会返回包含以下信息的记录:
alpn = "h2"
ipv4hint = 104.18.4.139,104.18.5.139
ech = AEX+DQBBmgAgACCNFwS4pgiG2q4rxde+tqxJ4wUIeoHX1aAAv4oYxDjlZwAEAAEAAQASY2xvdWRmbGFyZS1lY2guY29tAAA=
ipv6hint = 2606:4700::6812:48b,2606:4700::6812:58b
ECH记录内容解析
ech字段包含以下关键信息:
public_name: cloudflare-ech.com (公钥名称)pk: 8d1704b8a60886daae2bc5d7beb6ac49e305087a81d7d5a000bf8a18c438e567 (公钥)kemid: 32 (密钥交换算法ID)extensions: [] (协议扩展)version: 65037 (配置版本)cipher_suite: [{1 1}] (对称加密套件)
技术实现工具
ECH解析工具
GitHub项目:hellais/ech
当前CloudFlare ECH特点
- 所有CloudFlare ECH服务端共用一个公钥
- 可向任意开启ECH服务的CloudFlare域名发送DNS HTTPS类型请求获取TLS握手公钥
- 建议使用DoH(DNS over HTTPS)服务加密整个DNS查询过程
客户端实现
Golang官方支持
2024年5月Golang官方添加了ECH客户端支持:commit 578575
示例实现
GitHub项目:0xCaner/DoH2ECH_demo
编译方法
# Linux 64-bit
GOOS=linux GOARCH=amd64 go build -o DoH2ECH-demo-linux-amd64
# Windows 64-bit
GOOS=windows GOARCH=amd64 go build -o DoH2ECH-demo-windows-amd64.exe
# macOS 64-bit
GOOS=darwin GOARCH=amd64 go build -o DoH2ECH-demo-darwin-amd64
使用方式
Usage of DoH2ECH-demo-windows-amd64.exe:
-h 显示帮助信息
-host string
请输入你要访问的HOST (示例: www.discord.com) (default "www.discord.com")
-path string
请输入你要访问的PATH (示例: /) (default "/")
示例命令:
.\DoH2ECH-demo-windows-amd64.exe -host="www.discord.com" -path="/"
连接测试特点
- DNS查询:仅向dns.alidns.com发送请求(可替换为任意DoH服务)
- SNI可见性:只能看到cloudflare-ech.com
- 真实请求:inner-client-hello包使用公钥加密在Extension中,流量设备无法发现真实目标网站
验证ECH支持
可通过以下链接验证浏览器是否支持ECH:
- https://tls-ech.dev/
- https://cloudflare-ech.com/cdn-cgi/trace
技术优势
- 增强隐私保护
- 防止SNI嗅探
- 绕过网络审查(测试可绕过GFW)
- 完整加密握手过程
注意事项
- 目前主要依赖CloudFlare实现
- DNS查询建议使用DoH加密
- 公钥可能定期更新
- 需要客户端和服务器端同时支持