适用于 v2rayN、v2rayNG 与 v2flyNG 连接时出现的证书验证失败、TLS 握手中断等问题。先从日志区分时间、域名和信任链错误,再核对节点的连接地址、SNI 与传输层 Host;普通 TLS 与 REALITY 分开检查。每次只改一个字段,保留证书验证,最后用实际请求确认连接恢复。
一、先看日志:证书错误不等于端口不通
TLS 握手发生在传输连接建立之后。TCP 能连接,只能说明目标地址的端口有响应,不能证明证书可信、域名匹配或代理认证成功。v2rayN 中的 TCPing 有结果,而真连接测试失败,并不矛盾;不要因此反复切换本地代理端口。
先记录客户端名称、客户端版本、实际运行的内核版本、节点安全类型,以及失败时间。停止后台反复测试,只对一个节点发起一次连接,在日志里找同一时刻最内层的错误。外层的 failed to find an available destination 只是汇总信息,需要继续查看它后面的具体原因。
报错:x509: certificate has expired or is not yet valid
原因:本机时间不在证书有效期内,也可能是服务端证书确实过期。解法:先同步设备时间,再检查证书的起止日期;时间正确仍失败时由服务端续期或修正证书部署。
报错:x509: certificate signed by unknown authority
原因:信任链无法建立,常见于缺少中间证书、自签名证书或网络中的证书替换。解法:核对证书颁发者与完整链,不要直接关闭验证。
报错:remote error: tls: handshake failure
原因:对端拒绝了握手,可能涉及 SNI、协议版本、客户端证书要求或服务端策略。解法:先核对服务端要求的安全类型和 SNI,再结合服务端日志判断,不能仅凭这一行认定证书过期。
二、系统时间同步:检查日期、时区与证书有效期
证书带有 notBefore 和 notAfter 时间。校验使用系统时钟对应的绝对时间,不是仅看任务栏显示的小时数。单纯调整时区、同时保持绝对时间正确,通常不会让证书失效;把本地时间手动写成另一时区的时间,却可能造成数小时偏差。
-
核对日期
先确认年、月、日正确。设备长时间关机、恢复快照或主板时钟异常后,日期可能回到过去。不要只把分钟数调到看起来接近。
-
同步桌面时间
Windows 11 打开「设置」→「时间和语言」→「日期和时间」,启用「自动设置时间」,核对「时区」,再点击「立即同步」。macOS 打开「系统设置」→「通用」→「日期与时间」,开启自动设置时间与日期。
-
同步安卓时间
Android 通常位于「设置」→「系统」→「日期和时间」,打开「自动设置时间」及自动时区。不同系统名称可能不同,可在设置中搜索“日期和时间”。
-
重试并留证
确认同步成功后,重新启动客户端连接。若仍报过期,记录错误中的当前时间与证书有效期,交给节点维护方核对服务端实际提供的证书。
Windows 可在终端运行 w32tm /query /status 查看时间同步状态;同步命令 w32tm /resync 通常需要管理员权限,并依赖 Windows 时间服务。命令失败时先检查服务和网络,不要把“执行过命令”当作已同步。Linux 可用 timedatectl status 检查系统时钟与时间同步服务状态,具体启用方式取决于发行版。
结论:时间正确后仍过期,应检查服务端
同步成功且错误中的当前日期正确,就停止来回调整设备时钟。让维护方检查证书续期、服务重载,以及不同入口是否仍在提供旧证书。
三、SNI、连接地址与 Host:三个字段分别核对
SNI 是 TLS ClientHello 中用于指示目标主机名的扩展;客户端配置里的 serverName 通常同时用于选择握手名称和证书名称验证,具体行为取决于内核。它应符合服务端要求,并被证书的 SAN 域名覆盖。“伪装域名”不是一个统一协议字段,必须先确认提供方说的是 SNI、WebSocket Host,还是其他传输层参数。
| 字段 | 作用 | 核对重点 |
|---|---|---|
| 连接地址与端口 | 决定实际连接的服务器入口 | 可为域名或 IP;端口以节点提供的值为准 |
| SNI / serverName | TLS 握手名称及通常的证书名称验证依据 | 只填写域名,不带协议、路径或端口 |
| WebSocket Host | WebSocket 握手中的 HTTP 主机字段 | 应符合反向代理或上游站点的路由配置 |
| WebSocket path | WebSocket 请求路径 | 保留前导斜杠;路径错误通常不是证书名称错误 |
连接地址是 IP、SNI 是域名可以是正常配置。例如直接连接一个 IP,但通过域名完成 TLS 名称验证。反过来,删除 SNI 后让客户端按 IP 验证,而证书只包含域名,就可能出现 cannot validate certificate ... because it doesn't contain any IP SANs。不要把“地址与 SNI 不同”直接判为错误。
- v2rayN 主界面双击目标节点进入编辑窗口,核对地址、端口、传输安全及 SNI;保存前记录原值。界面名称随版本变化,SNI 也可能显示为服务器名称。
- v2rayNG 与 v2flyNG 在节点列表点击目标条目的编辑按钮,展开传输或 TLS 设置核对对应字段;只修改当前节点,不要顺手改变全局路由。
- SNI 应写成
example.com这样的主机名,不能写成https://example.com:443/path。这里的域名仅作格式说明,实际值必须来自节点配置。 - 通配符证书的
*.example.com通常可匹配a.example.com,不匹配根域名example.com,也不匹配a.b.example.com。
下方是普通 TLS 的局部配置示意,不是完整可连接节点,也不适用于 REALITY。实际节点的传输类型必须保持原值;示例省略了连接地址、身份认证与其他出站字段。
{
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"serverName": "example.com",
"allowInsecure": false
}
}
}
四、allowInsecure:不能代替修复证书
allowInsecure 设为 true 会跳过常规服务端证书验证。界面中的“允许不安全连接”或“跳过证书验证”通常对应这一行为。TLS 加密仍可能存在,但客户端不能再通过常规证书链与名称校验确认对端身份;它不是“提高兼容性”的通用按钮。
现象:关闭验证后连接成功
原因:故障可能位于证书有效期、域名匹配或信任链,而不一定是网络质量。解法:恢复验证,再逐项修复对应证书问题;这个现象不能证明对端身份可靠。
现象:关闭验证后仍握手失败
原因:问题可能发生在证书校验之前,例如端口不是 TLS 服务、SNI 被服务端拒绝或安全类型填错。解法:回到地址、端口与握手配置检查,不要继续叠加不安全选项。
- 公开可信证书:应由服务端提供叶证书及必要的中间证书,客户端保持验证开启。
- 私有证书体系:只有在明确控制证书来源时,才按组织规范部署信任根或受支持的证书约束;不能从陌生提示中随意安装根证书。
- 旧系统信任库:检查系统更新与受信任根证书状态,不要把未知证书导入当作第一步。
五、指纹与 REALITY:按实际内核分支排查
客户端指纹描述 TLS 握手特征,不是证书域名,也不是跳过验证开关。在支持相关功能的 Xray 配置中,fingerprint 可能使用 chrome 等内核支持的值。修改它不会让过期证书重新有效,也不会让不匹配的 SAN 自动包含目标域名。
| 配置类型 | 优先检查 | 不要混用 |
|---|---|---|
| 普通 TLS | 设备时间、serverName、证书有效期与完整链 | 不要用 REALITY 的公钥参数替代证书配置 |
| REALITY | serverName、服务端公钥、shortId、指纹及服务端要求 | 不要套用普通 TLS 的关闭证书验证思路 |
| 不启用 TLS 的节点 | 先确认该错误是否来自订阅更新、测试目标或另一条连接 | 不要在原节点上随意补开 TLS |
v2rayNG 使用 Xray 内核,v2flyNG 使用 V2Fly 内核,功能与字段不能机械互抄。v2rayN 则要以当前节点实际运行的内核为准。遇到 REALITY 或 XTLS Vision 配置,应先确认所选内核支持这些特性;不能仅因为客户端能导入链接,就认定所有参数都已生效。
- 普通 TLS:先保留原指纹设置,修复时间与 SNI。只有日志或服务端要求明确指向握手兼容性时,再测试一个受支持的指纹值。
- REALITY:逐字核对提供方给出的服务器名称、公钥及 shortId;同时检查设备时间,服务端若设置时间偏差限制,时钟错误也会影响认证。
- VLESS 的 flow 属于另一层配置。若节点要求
xtls-rprx-vision,应与服务端匹配,但修改 flow 不能修复普通 TLS 的证书名称错误。
六、用握手工具定位:端口、证书链与服务端
若设备已安装 OpenSSL,可用它直接观察普通 TLS 入口的证书。下面命令中的 example.com 是格式示例,执行前必须替换成实际入口与服务端要求的 SNI。连接端口同样以节点为准;该测试只验证 TLS 层,不会验证 VMess 或 VLESS 的身份认证。
openssl s_client -connect example.com:443 -servername example.com -showcerts -verify_hostname example.com -verify_return_error
- 查看证书的有效期、SAN 与颁发者;确认返回的是目标服务证书,而不是网关、登录页面或其他站点的证书。
- 关注验证结果及错误原因。工具和客户端可能使用不同信任库,因此工具通过只是定位线索,仍要回到客户端复测。
- 如果连接在返回证书前就被关闭,检查端口是否真的是 TLS 入口、SNI 是否获准,以及前置代理的转发配置。
- 更换受信任的网络后返回证书发生变化,应检查网络设备或安全软件是否替换了证书;不要在来源未明时接受新证书。
- 普通 OpenSSL 探测不能验证 REALITY 的专用认证参数。REALITY 应结合客户端内核日志与服务端日志排查。
结论:工具通过,只代表该次 TLS 检查通过
证书验证正常而代理仍失败时,转查传输路径、身份参数与服务端入站配置。不要继续修改已经验证正确的 SNI,更不要把所有握手后的失败都归为证书问题。
七、修复后的验证与常见追问
每次修改后先保存节点,再重新建立连接;已有长连接不一定立即应用新参数。按“内核启动正常 → 节点握手成功 → 实际请求可用”的顺序验收。若客户端日志已经没有证书错误,但浏览器仍异常,应转查系统代理、应用代理设置与路由规则,不要把排查范围重新扩大到全部 TLS 参数。
- 确认自动校时成功,并检查设备重启后日期仍然正确。
- 确认 SNI 与服务端要求一致,证书验证保持开启,传输层 Host 和路径未被误改。
- 选择修复后的节点,执行一次真连接测试,再通过已正确设置代理的应用访问实际目标。
- 记录修复字段与结果;如果配置来自订阅,联系提供方修正源数据,避免下次更新覆盖本地改动。
更新订阅时报证书错误,也是节点的 SNI 错了吗?
不一定。订阅下载是客户端对订阅地址发出的 HTTPS 请求,验证的是订阅站点的证书,通常不使用节点编辑窗口里的 SNI。先判断错误发生在“更新订阅”还是“连接节点”,再检查对应域名、系统时间与信任链。
同一节点在另一台设备可用,能排除服务端问题吗?
不能完全排除。两台设备可能解析到不同入口,使用不同信任库、内核或时间设置。先对比实际连接地址、SNI、证书颁发者与到期时间,再逐项对比配置,不要直接复制整套系统设置。
浏览器能打开伪装域名,为什么客户端还失败?
浏览器可能连接了不同地址,使用了不同信任库,也未必经过相同传输路径。页面能打开只证明那一次网页请求成功。客户端仍需按节点提供的地址、端口、SNI、传输参数及身份参数完成连接。