Trojan 协议如何通过 TLS 建立连接
拆解 Trojan 建立连接的完整过程:TLS 握手、SNI 声明、证书验证、密码验证与回落机制,并解释 sni、skip-cert-verify、alpn 等常见配置字段的含义,说明 Trojan 流量为何接近普通 HTTPS。
Trojan 建立连接的过程可以概括为「一次标准 TLS 握手,加一次隐藏在密文里的密码验证」。客户端首先像浏览器一样与服务器完成 TLS 握手——包括 SNI 声明、证书验证和密钥协商;握手成功后,再在加密通道内发送密码哈希与目标地址,服务端验证通过即开始转发,验证失败则回落到伪装网站。理解这条链路,就能看懂 sni、skip-cert-verify、alpn 这些配置字段各自管什么,也能解释绝大多数握手类连接错误。
核心结论
- Trojan 的外层就是标准 TLS,没有私有握手,这是它接近普通 HTTPS 的根本原因;
- SNI 决定服务端出示哪张证书,必须与证书域名匹配;
- 密码验证发生在 TLS 之内,失败不报错而是回落到真实网站;
skip-cert-verify: true会关闭身份验证,只应临时用于排查。
工作原理
一次完整的 Trojan 连接分为三个阶段。
**第一阶段:TLS 握手。**客户端向服务器(通常是 443 端口)发起 ClientHello,其中携带 SNI 扩展,声明自己要访问的主机名。服务端根据 SNI 返回对应的证书,双方协商加密套件并完成密钥交换。从这一刻起,后续所有数据都在加密通道内传输。这一阶段与访问任何 HTTPS 网站的过程逐字节兼容,遵循 RFC 8446 定义的标准流程。
**第二阶段:证书验证。**客户端检查服务端证书是否由受信任的机构签发、是否在有效期内、域名是否与 SNI 匹配。任何一项不通过,连接立即终止——这也是系统时间错误、SNI 填错都会导致连接失败的原因。
**第三阶段:密码验证与转发。**握手完成后,客户端发送的第一段数据是 Trojan 请求:密码的 SHA-224 哈希、目标地址与端口。服务端比对哈希,匹配则与目标建立连接并双向转发;不匹配则触发回落——把这条连接当作普通 HTTP(S) 请求,转交给本机上的一个真实网站处理。主动探测者无论怎么访问这台服务器,得到的都是正常网页,从外部无法证明它是代理。
核心组成
客户端配置中与 TLS 相关的字段,对应上述流程中的具体环节:
| 字段 | 作用 | 建议取值 |
|---|---|---|
sni | 握手时声明的主机名,决定服务端返回哪张证书 | 服务方指定值,留空时多数客户端回退为服务器地址 |
skip-cert-verify | 是否跳过证书验证 | false(默认);仅排查时临时改 true |
alpn | 应用层协议协商,声明通道内承载的协议 | 通常 h2, http/1.1,与普通浏览器一致 |
password | 用于第三阶段的身份验证 | your-password(占位示例) |
一个 Clash 系客户端的最小示例(域名与密码为占位符):
- name: "示例节点"
type: trojan
server: node1.example.com
port: 443
password: "your-password"
sni: node1.example.com
alpn: ["h2", "http/1.1"]
skip-cert-verify: false
优点
- 无私有握手特征:所有可观测部分都是标准 TLS,与海量正常 HTTPS 流量混在一起;
- 证书体系背书:身份验证复用公共 CA 体系,客户端无需额外信任配置;
- 回落即防御:探测请求得到的是真实网站响应,服务端不会因为「拒绝连接的方式可疑」而暴露;
- 字段少,不易配错:相比多传输层组合的协议,Trojan 的 TLS 配置面很小。
限制
- 强依赖证书链完整:域名过期、证书未续期、设备时间偏差都会让连接直接失败;
skip-cert-verify是双刃剑:开启后连接问题消失的同时,中间人风险也随之出现;- TLS-in-TLS 形态:访问 HTTPS 网站时通道内还有一层 TLS,存在被行为分析关注的讨论,协议本身不提供针对性混淆;
- 回落站点质量取决于搭建者:回落到明显异常的页面会削弱伪装效果,这一点使用者无法控制。
与其他协议的区别
| 维度 | Trojan | VLESS + TLS | Shadowsocks |
|---|---|---|---|
| TLS 是否强制 | 是,协议内建 | 否,由传输层可选叠加 | 否,自带对称加密 |
| 身份验证时机 | TLS 之内首包密码哈希 | TLS 之内 UUID | 加密参数即凭据 |
| 验证失败行为 | 回落到真实网站 | 取决于服务端(可配回落) | 直接断开或无响应 |
| 对证书的依赖 | 必须有效证书 | 视配置(REALITY 可借用他站证书) | 无 |
概括地说:Trojan 把「必须有 TLS」写进了协议本身,伪装能力与证书体系深度绑定;VLESS 把 TLS 当作可拆卸的传输层;Shadowsocks 则完全不走 TLS 路线。三者的完整取舍见 Trojan、VLESS 与 Shadowsocks 有什么区别。
适用场景
理解本文机制后,你可以更有依据地处理配置与故障:手动添加节点时,严格按服务方提供的 sni 填写,不随意开启 skip-cert-verify;遇到握手类报错时,按「时间 → SNI → 证书 → 密码」的顺序检查,具体步骤见 Trojan TLS 握手失败怎么处理与 Trojan 证书验证失败的原因和解决方法。若你还不清楚 Trojan 节点的整体概念,建议先读 Trojan 节点是什么。
延伸阅读
- Trojan 节点是什么——先建立整体概念再看握手细节;
- Trojan TLS 握手失败怎么处理——本文机制对应的故障排查;
- Trojan 证书验证失败的原因和解决方法——证书环节的专项处理;
- 术语速查:TLS · SNI;更多协议文章见 Trojan 协议专栏。
常见问题
- skip-cert-verify 可以设为 true 吗?
- 不建议长期开启。跳过证书验证意味着客户端不再确认对端身份,理论上存在被中间人替换的风险。它只适合在排查证书问题时临时使用,或在服务方明确说明使用自签证书时按其指引开启。日常使用应保持证书验证生效。
- SNI 填错了会出现什么现象?
- 服务端会返回与该 SNI 不匹配的证书,或直接按未知主机处理,客户端证书验证失败,连接中断。表现通常是节点测延迟超时,或日志中出现 certificate verify failed、handshake failure 一类错误。核对服务方提供的 SNI 字段即可解决。
- 回落(fallback)对使用者有什么影响?
- 正常使用时完全无感。回落只在密码验证失败或请求不符合 Trojan 格式时触发,把访问者引向一个真实网页。对使用者的间接影响是:密码填错不会看到明确报错,只会表现为无法上网或超时,排查时容易误判为节点故障。
- 为什么说 Trojan 流量接近普通 HTTPS?
- 因为 Trojan 不自定义加密握手,外层完全复用标准 TLS:握手报文、证书交换、加密套件协商都与浏览器访问网站一致,常用端口也是 443。中间设备能看到的只是一条去往某域名的 TLS 连接,难以仅凭流量外观将其与正常网站访问区分。