tech/protocol · 集群 B · 加密与安全边界 · 1/6
代理协议中的 TLS:握手流程、证书校验与 TLS 1.3 的关键变化
TLS 为 Trojan、VLESS、Hysteria2 等协议提供机密性、完整性与服务端身份校验。握手阶段双方协商密钥,客户端通过证书链确认服务端身份;TLS 1.3 把握手缩短为一次往返并加密了证书,但 SNI 在未启用 ECH 时仍是明文。关闭证书校验后加密仍在,但身份校验失效,存在中间人风险。
TLS 在代理协议里扮演什么角色
TLS 在代理协议里扮演的是「安全外壳」:它负责加密、防篡改和确认对端身份,而代理协议本身只负责认证用户和告诉节点去哪。这种分工让代理协议可以设计得很精简,同时复用一套经过长期审计的安全机制。
不同协议依赖 TLS 的方式不同:
| 协议 | 与 TLS 的关系 |
|---|---|
| Trojan | 完全建立在标准 TLS 之上 |
| VLESS | 不自带加密,必须搭配 TLS 或 REALITY |
| VMess | 自带加密,TLS 可选,常用于 WebSocket + TLS 组合 |
| Hysteria2 | QUIC 内置 TLS 1.3 |
| REALITY | 在 TLS 1.3 握手框架内用公钥认证替代证书方案 |
| Shadowsocks | 不使用 TLS(除非通过插件) |
握手的每一步在做什么
TLS 1.3 握手的核心目的有两个:协商出只有双方知道的会话密钥,以及让客户端确认服务端身份。整个过程在一次往返内完成:
客户端 服务端
│ ClientHello │
│ - 支持的 TLS 版本与密码套件 │
│ - 密钥共享参数(如 x25519 公钥) │
│ - SNI(要连接的域名,明文) │
│ - ALPN(希望使用的应用层协议) │
│ ─────────────────────────────────────────────────▶ │
│ ServerHello │
│ 选定的套件 + 服务端密钥共享参数 │
│ ── 此后握手消息开始加密 ── │
│ 证书 + 证书签名 + Finished │
│ ◀───────────────────────────────────────────────── │
│ 校验证书链 → 发送 Finished │
│ ─────────────────────────────────────────────────▶ │
│ ═══════════════ 应用数据(加密) ═══════════════ │
第一步,客户端在 ClientHello 中同时给出密钥共享参数,这是 TLS 1.3 能在一次往返内完成握手的原因;第二步,服务端选定参数后,双方即可计算出握手密钥,证书等后续消息都在加密状态下发送;第三步,客户端校验证书链和签名,确认对方确实持有该域名证书的私钥,然后握手完成。
证书校验:防止中间人的关键
证书校验是 TLS 中真正负责「确认你在和谁说话」的环节,加密本身并不能防止中间人。如果没有身份校验,攻击者可以分别与客户端、服务端各建立一条加密连接,在中间解密再转发,双方都以为自己在和对方通信。
客户端校验证书时主要检查:
| 检查项 | 含义 | 失败时 |
|---|---|---|
| 证书链 | 是否能追溯到系统信任的根证书 | 报「不受信任的证书」 |
| 域名匹配 | 证书域名是否与 SNI 一致 | 报「域名不匹配」 |
| 有效期 | 当前时间是否在有效期内 | 报「证书过期或尚未生效」 |
| 签名 | 服务端是否持有对应私钥 | 握手失败 |
代理配置中常见的 skip-cert-verify 或 allowInsecure 字段,作用就是跳过上述校验。开启后连接仍然加密,但客户端不再确认对端身份。部分服务商因使用自签证书或特殊部署而下发此设置,这属于服务商的部署选择;用户层面的合理做法是按订阅使用、不自行开启,并在不确定时向服务商询问原因。
有效期检查依赖设备时间,这是证书错误的高发原因:设备时间偏差较大时,有效的证书也会被判为过期或尚未生效。遇到证书类报错,先确认系统时间与时区,再参考 故障排查 专题逐层排查。
SNI 与 ALPN:握手里的两个明文字段
SNI(服务器名称指示)和 ALPN(应用层协议协商)是 ClientHello 中两个与代理关系密切的字段,前者告诉服务端要连接哪个域名,后者告诉服务端希望用什么应用层协议。
SNI 的存在是因为一台服务器上可能托管多个域名,服务端需要据此选择返回哪张证书。在 TLS 1.3 中,证书已经加密,但 SNI 仍是明文;ECH(加密的 ClientHello)是解决这一问题的扩展,目前部署仍在推进中。在代理场景中,网络上可以观察到的是你连接节点时使用的 SNI 和节点 IP,而不是你通过代理访问的具体网站。
ALPN 常见值包括 h2(HTTP/2)和 http/1.1,Hysteria2 所基于的 QUIC 则使用 h3。订阅中的 alpn 字段需与服务端一致,不一致可能导致握手失败。
TLS 1.2 与 TLS 1.3 的差异
对代理使用者而言,TLS 1.3 相比 1.2 最重要的变化是握手更快、更多内容被加密、过时的算法被移除。
| 对比项 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 完整握手往返 | 2 次 | 1 次 |
| 证书是否加密 | 否 | 是 |
| 密钥交换 | 支持多种,含不具前向保密的方式 | 仅保留具备前向保密的方式 |
| 可用套件 | 较多,含过时算法 | 精简为少量现代 AEAD 套件 |
| 会话恢复 | Session ID / Ticket | PSK,可选 0-RTT |
前向保密意味着即使服务端私钥日后泄露,过去记录下来的流量也无法被解密。TLS 1.3 强制前向保密,这是它在安全性上的重要进步。0-RTT 能进一步减少延迟,但存在重放风险,是否启用取决于实现。
用户真正需要检查的三件事
对普通用户来说,理解 TLS 原理的最终目的是在配置和排障时知道看哪里,而不是去调整密码套件。实际需要关注的只有三件事:
1. 设备时间是否准确 → 决定证书有效期校验能否通过
2. 证书校验是否被关闭 → 决定能否确认服务端身份
3. 客户端是否来自可信渠道 → 来源不明的客户端可能篡改信任链
第三点常被忽视:TLS 的信任链依赖系统或客户端内置的根证书,如果使用来源不明的修改版客户端,信任链本身可能被替换,此时证书校验也失去意义。客户端安全问题可参考 安全与隐私 专题。
TLS 能保护的是传输途中的内容,它不能决定节点服务商看到什么,也不能让你在目标网站面前匿名,这一边界在 加密不等于匿名 中有详细讨论。想了解各协议如何使用 TLS,可回到 代理协议 专题总览;查看品牌协议资料,可前往 机场品牌库。
常见问题
TLS 在代理里负责什么?
负责三件事:加密传输内容、保证数据未被篡改、让客户端确认对端是合法服务端。VLESS、Trojan 等协议把这三件事都交给 TLS。
关闭证书校验(skip-cert-verify)有什么风险?
连接仍然加密,但客户端不再确认对端身份,如果有人在中间冒充服务端,客户端无法察觉。应按服务商订阅使用,不建议自行开启。
TLS 1.3 下别人还能看到我访问了什么网站吗?
代理场景中,网络上能看到的是你连接代理节点时 ClientHello 里的 SNI 与节点 IP,看不到你经由代理访问的具体网站内容。未启用 ECH 时 SNI 为明文。
证书错误一般是什么原因?
常见原因包括设备时间不准导致证书被判为未生效或过期、SNI 与证书域名不匹配、证书本身过期,可先检查设备时间。
信息来源与更新时间
- 信息来源
- 品牌清单资料(品牌公开信息整理)
- 测试范围
- 本站未进行测速与解锁实测,所有能力描述均为资料声明或未测试状态。
- 发布时间
- 待核实
- 核实日期
- 待核实
- 最近更新
- 待核实