tech/protocol · 集群 B · 加密与安全边界 · 1/6

代理协议中的 TLS:握手流程、证书校验与 TLS 1.3 的关键变化

发布时间 待核实核实日期 待核实最近更新 待核实测试状态 Not Tested
Answer First · 核心结论

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 与证书域名不匹配、证书本身过期,可先检查设备时间。

信息来源与更新时间

信息来源
品牌清单资料(品牌公开信息整理)
测试范围
本站未进行测速与解锁实测,所有能力描述均为资料声明或未测试状态。
发布时间
待核实
核实日期
待核实
最近更新
待核实

字段含义与数据状态见 字段说明;核查进度见 品牌动态与核查日志。