适用于 v2rayN、v2rayNG 和 v2flyNG 中启用常规 TLS 的节点。先从连接日志提取证书错误,再依次核对系统时间、TLS 的 serverName/SNI 和服务端证书链。每次只改一项、重新连接一次,就能区分本机设置问题与需要节点维护方处理的问题;使用 REALITY 的节点应按其独立参数排查,不能直接套用常规证书链修复。
一、从日志区分证书错误与连接失败
“TLS 握手失败”只是结果,不是具体原因。先在 v2rayN 主窗口底部日志区域查看刚才那次连接的完整错误;如果日志区域被收起,先展开对应面板。不同版本界面位置可能变化,但应以包含 x509、tls 或 certificate 的内核原文为准,而不是只看浏览器显示的“连接已重置”。
选定一个节点,记录连接时间,只发起一次请求。下面的英文片段是常见错误形式,实际日志还可能附带内核模块名、连接地址及嵌套原因。分享日志前删除订阅地址、用户标识和访问目标中的敏感信息。
报错:x509: certificate has expired or is not yet valid
原因与解法:本机当前时间落在证书有效期之外,或服务端证书确实过期——先同步本机时间,再检查证书的起止日期。
报错:x509: certificate is valid for example.com, not www.example.com
原因与解法:验证使用的名称不在证书覆盖范围内——核对节点要求的 SNI 与证书 SAN,不能仅凭域名相似就替换。
报错:x509: certificate signed by unknown authority
原因与解法:证书链无法连接到受信任根,可能缺少中间证书或使用了未受信任签发者——检查服务端完整证书链和本机信任库。
二、同步系统时间,再判断证书是否过期
TLS 验证比较的是当前时间与证书的 notBefore、notAfter。电脑断电后时钟重置、虚拟机恢复旧快照、手动修改日期,都可能让仍有效的证书被判定为“尚未生效”或“已经过期”。先核对年月日和分钟,不要只看任务栏上的小时。
-
核对日期
Windows 11 打开「设置」→「时间和语言」→「日期和时间」,检查日期、时间及当前时区;与另一台已正常同步时间的设备比较。
-
立即同步
启用「自动设置时间」,在「其他设置」中点击「立即同步」。若提示同步失败,先恢复普通网络连接,再重试系统时间服务。
-
重新连接
回到客户端,重新启用当前节点并发起新请求。以新日志为准,不要继续判断同步前留下的旧错误。
-
检查有效期
时间已准确仍提示过期时,读取服务端实际返回证书的有效期。若当前时间确实晚于 notAfter,需要维护方续签并让 TLS 服务重新加载证书。
Android 可在系统「设置」中搜索「日期和时间」,启用自动设置时间;具体菜单随设备系统变化。时区影响显示方式,底层绝对时间准确时,单纯选择另一时区通常不会触发证书错误。反过来,手动把时钟调回过去即使暂时连通,也会干扰其他服务,不能作为修复方案。
时间同步与节点连接是两条不同的链路。节点使用 443 端口,不代表时间同步也通过该端口;排查同步服务的网络策略时,应检查其实际使用的时间源和协议,不要为此随意开放本机入站端口。
三、核对 SNI、服务器地址与 Host
节点的“地址”、TLS 的“服务器名称”和 WebSocket 的“Host”并不等价。服务器地址决定连接到哪里;SNI 位于 TLS 握手中,帮助服务端选择站点及证书;HTTP Host 或 HTTP/2 的 authority 属于应用层请求。修改 Host 不会自动修正证书验证使用的名称。
| 字段 | 作用 | 核对重点 |
|---|---|---|
| 地址、address | 确定远端连接目标 | 可以是域名或 IP;端口单独填写 |
| serverName、SNI | 发送 TLS 服务器名称,并通常用于名称验证 | 使用维护方指定且被证书覆盖的主机名 |
| Host | 传输层上的 HTTP 请求主机字段 | 按服务端 WebSocket 或反向代理配置填写 |
| SAN | 证书允许验证的域名或 IP 列表 | 名称必须满足证书中的匹配规则 |
在 v2rayN 主窗口双击节点,进入服务器编辑窗口,确认传输安全为 TLS,再核对「SNI」或对应的服务器名称字段;不同版本字段标签可能不同,应对照 serverName 的含义。v2rayNG 可从节点卡片的编辑入口进入,检查 TLS 设置中的 SNI。不要把 https://、:443 或 URL 路径一起填入主机名字段。
- 使用 IP 作为连接地址时,仍可能需要显式填写域名 SNI;否则客户端可能按 IP 验证,而证书只包含域名。
*.example.com通常可以匹配a.example.com,不能据此认定它也覆盖example.com或a.b.example.com。- “伪装域名”是容易混用的界面叫法。应先确认它实际对应 SNI 还是 Host,再与维护方提供的参数逐项比较。
- 订阅更新后问题复现时,检查订阅中的 SNI 是否仍是旧值。只修改本地副本,可能在下一次更新时被覆盖。
结论:名称不匹配时先改 SNI,不先换 DNS
如果日志已经明确写出“证书适用于 A,而当前验证 B”,先确认 B 是否填错。只有名称配置正确、却连接到了错误服务器或错误证书时,再沿解析结果、反向代理和站点选择继续排查。
四、检查证书链与服务端实际返回内容
“unknown authority”不等同于“证书过期”。一个站点即使使用了有效的域名证书,漏发中间证书也可能让客户端无法建立完整信任链。浏览器访问成功不能完全排除这类问题:浏览器与代理内核使用的信任库、缓存或中间证书获取方式可能不同。
如果系统已安装 OpenSSL,可用以下命令检查服务端。这里的 example.com 是保留示例域名,不是本站节点;执行前将命令中的域名与端口改为实际值。连接地址与 SNI 不同时,-connect 填真实连接目标,-servername 和 -verify_hostname 填预期的 TLS 主机名。
openssl s_client -connect example.com:443 -servername example.com -showcerts -verify_hostname example.com -verify_return_error
- 查看返回的叶证书是否属于预期站点。拿到别的站点证书时,应检查 SNI 和服务端虚拟主机配置。
- 查看
Certificate chain是否包含所需中间证书。服务端通常应发送叶证书及中间证书,不必附带根证书。 - 查看最终验证结果。
Verify return code: 0 (ok)表示此次测试在当前工具的信任环境下通过,不能代表所有设备都一定通过。 - 若 OpenSSL 本身没有正确配置 CA 信任路径,也可能报签发者错误,应先确认测试工具的信任环境,避免误判服务端。
维护方应在实际终止 TLS 的服务上配置完整证书链。例如前面有反向代理时,要更新反向代理加载的证书,而不是只改后端内核目录里的文件。续签完成后还要重新加载相关服务,并从外部重新握手,确认返回的是新证书。
五、修复后按同一条件复测
排查时同时更换节点、修改 SNI、切换 DNS 和启用 Tun,会让结果失去可比性。保留同一节点与同一测试目标,每次只调整一个变量。下面的顺序能把“配置修正”和“偶然换了一条可用线路”区分开。
- 固定基线:记录当前节点地址、端口、TLS 类型和 SNI,保留报错时间;不要公开节点凭据。
- 同步后复测:保持节点参数不变,只同步系统时间。若有效期错误消失,再观察是否还有名称或信任链错误。
- 改名后复测:按维护方提供的值修正 SNI,重新连接,并检查新日志中验证的名称是否符合预期。
- 换网对照:同一设备、同一节点在另一网络上测试。只有某一网络返回不同证书时,再检查网络拦截、解析和中间设备。
- 确认持续有效:更新订阅并重新打开客户端后再测一次,检查修复值是否被订阅覆盖,或服务端是否仍返回旧证书。
如果正确时间、正确 SNI 下仍提示证书已过期或链不完整,客户端能修复的范围已经有限。向维护方提供错误原文、测试时间、客户端及内核版本、连接端口和预期 SNI,通常比只发“节点不能用”的截图更便于定位。更多网络和内核故障可查阅排查手册。
六、常见疑问:跳过验证与握手中断
打开 allowInsecure 或“跳过证书验证”能解决吗?
这会绕过身份验证,不会修复时间、域名或证书链。即使连接恢复,也只能说明证书验证环节可能参与了故障,不能证明连接到了正确服务端。应保持验证开启,按日志修复具体原因,不把该开关作为长期配置。
只有 TLS handshake failure,没有 x509,下一步查什么?
先检查客户端 TLS 类型是否与服务端一致,再核对 SNI、ALPN 和传输方式。服务端也可能在发出证书前主动中断连接。此时需要结合服务端日志,不能直接认定系统时间错误,也不宜先降低 TLS 安全设置。
浏览器能打开节点域名,为什么客户端仍报错?
浏览器访问的地址、端口、解析结果和 SNI 可能与节点不同,浏览器也可能缓存了中间证书。必须比较同一个目标与同一个名称。域名首页能访问,只能说明那次浏览器请求成功,不能替代节点 TLS 参数检查。
REALITY 节点是否也要检查普通证书链?
REALITY 与常规 TLS 的配置及验证机制不同。应先确认传输安全类型,再核对服务端要求的 serverName、公钥、shortId 等参数。不要把普通 TLS 的证书续签步骤机械套用到 REALITY,也不要随意改成 TLS 试图消除报错。