适合在 v2rayN、v2rayNG 或 v2flyNG 日志中看到证书验证失败的用户。先读取底层报错,再同步系统时间、核对 TLS 的 SNI 与证书名称,最后检查服务端证书链;全程保留证书验证,每次只修改一个设置,避免把暂时连通误当成修复完成。
先看日志:区分证书失败与连接超时
节点显示无法连接,不一定是 TLS 问题。TLS 握手发生在建立底层连接之后、传输代理协议数据之前;只有日志明确出现 x509、certificate 或具体握手原因,才适合沿着证书这条线排查。单独的 context deadline exceeded 只表示超过等待时间,不能据此判断证书过期。
在 v2rayN 主窗口查看底部日志区域;如果当前界面版本将日志放在独立入口,打开「日志」后再重连一次。在 v2rayNG 主界面侧边菜单打开「日志」,停止服务后重新启动,定位刚刚产生的记录。v2flyNG 也应查看本次连接的内核日志,不要把上一次失败记录当成当前结果。不同版本入口位置可能变化,应以实际界面为准。
- 记录客户端版本、当前内核类型、连接时间和完整底层错误,而不只是截取最外层的“连接失败”。
- 临时停止浏览器后台请求,再进行一次连接,减少多条错误交错造成的误判。
- 分享日志前隐去订阅链接、认证标识和服务器地址;保留错误类型、时间戳以及经过遮蔽的域名对应关系。
按 x509 报错原文确定检查方向
下面列出常见的真实错误片段。完整日志可能带有内核前缀、证书名称或日期,措辞也可能随内核版本变化。应读取最内层原因;尤其是有效期错误,必须结合其中的当前时间与证书有效期判断,不能只看到“过期”就要求更换节点。
报错:x509: certificate has expired or is not yet valid
原因与解法:客户端认为证书不在有效期内。先核对系统时间;时间准确后仍复现,再请服务端维护者检查证书起止日期和续期部署情况。
报错:x509: certificate signed by unknown authority
原因与解法:证书链无法连接到受信任的根,可能是中间证书缺失、私有证书或系统信任库问题。核实证书来源和服务端完整链,受管理设备还需检查网络的证书替换策略。
报错:x509: cannot validate certificate for 192.0.2.1 because it doesn't contain any IP SANs
原因与解法:客户端正用 IP 地址验证一张没有对应 IP 类型 SAN 的证书。这里的地址仅为文档示例;实际应按服务端资料填写证书覆盖的 TLS 名称,而不是随便换一个域名。
报错:remote error: tls: handshake failure
原因与解法:远端中止了 TLS 握手,未必是本机证书验证失败。核对 SNI、端口、TLS 设置与服务端接入要求,再由维护者对照同一时间的服务端日志。
如果日志提示证书对某个名称有效、却不适用于当前名称,优先检查 SNI 和验证名称。若只是 EOF 或连接被重置,还可能是端口对应的服务不接受当前握手,不应直接归因于系统时间。
系统时间同步:先修时钟,再判断证书过期
证书包含生效时间和到期时间。设备时间落在这个区间之外,即使服务端部署正常,也会被判定为尚未生效或已经过期。双系统切换、主板电池异常、长时间离线以及手动调整日期,都可能造成偏差。时区主要影响显示;仅把时区改正确,并不保证系统记录的实际时刻已经正确。
-
核对日期
先检查年、月、日和小时。在 Windows PowerShell 执行
Get-Date -Format o,查看包含时区偏移的完整时间,再与可信时钟对照。 -
同步时钟
Windows 11 打开「设置」→「时间和语言」→「日期和时间」,启用「自动设置时间」,在「其他设置」中点击「立即同步」。同步失败时先解决网络或时间服务问题。
-
检查安卓
Android 常见入口为「设置」→「系统」→「日期和时间」,开启「自动设置时间」与「自动设置时区」。厂商菜单不同可在设置中搜索“日期和时间”,并确认显示时间已更新。
-
重新连接
同步完成后停止并启动客户端连接,查看新产生的日志。如果当前时间正确,而证书结束日期确实已过去,应由服务端续期并重新加载证书。
Windows 还可用 w32tm /query /status 查看时间同步来源与状态;命令报服务未运行时,应先检查 Windows Time 服务,而不是反复重启代理内核。在受组织策略管理的设备上,应联系管理员修复指定时间源,不要擅自覆盖管理策略。
SNI 与伪装域名:分别核对地址、名称和 Host
SNI 是 TLS 握手中告知服务器目标名称的扩展,服务器可据此选择证书或虚拟主机。通常所填的 TLS 服务器名称也会用于证书名称验证,但部分内核支持单独指定验证名称,因此还要检查是否存在显式覆盖。服务端资料中的“伪装域名”并不是统一字段定义,必须确认它究竟指 SNI、HTTP Host,还是其他传输参数。
| 配置项 | 实际作用 | 检查重点 |
|---|---|---|
| 地址与端口 | 决定连接到哪个服务器入口。 | 地址可以是域名或 IP;端口必须与服务端一致,不能因为使用 TLS 就一律改成 443。 |
| SNI / serverName | 通常用于发送 TLS 名称,并作为证书名称验证依据。 | 填写服务端要求的纯域名,不带协议前缀、路径或端口。 |
| 证书 SAN | 列出证书允许验证的 DNS 名称或 IP 地址。 | 验证名称必须被覆盖;通配符 *.example.com 通常不覆盖 example.com 或更深层子域名。 |
| WebSocket Host | 用于 TLS 之后的 HTTP 请求路由。 | 按传输配置填写;修改 Host 不能直接修复此前发生的证书名称不匹配。 |
| WebSocket Path | 指定 HTTP 升级请求的路径。 | 保持服务端给出的路径;路径错误通常不属于证书校验问题。 |
在 v2rayN 中双击目标节点,进入节点编辑窗口,核对 TLS 区域的「SNI」或对应服务器名称字段;在 v2rayNG 中点击节点右侧编辑图标,检查 TLS 设置中的「SNI」。字段的显示名称随版本可能变化,查找时应以 TLS 区域为准,不要把传输设置中的「Host」当成同一项。v2flyNG 也应使用与当前内核及节点协议相匹配的字段。
例如,服务端明确要求以 edge.example.com 作为 TLS 名称时,这一栏不能填成 https://edge.example.com/。这里的域名仅用于说明格式,并非可用节点参数。服务器地址为 IP 并不必然错误:只要连接目标正确,且 TLS 使用经过授权、被证书覆盖的名称,就不必强行把地址栏也改成该域名。
结论:先确认 TLS 名称,再改传输参数
日志明确指出名称不匹配时,先对照服务端给出的 SNI 与证书 SAN;只有证书验证通过后仍出现 HTTP 或升级失败,才继续核对 Host 和路径。
保持证书验证:检查服务端链与网络环境
“跳过证书验证”可能显示为 allowInsecure 或类似选项。启用后,客户端可能不再正常检查证书链或名称,这并不表示服务器身份已经确认,也没有修复原来的配置。排查时应保持该选项关闭;如果此前已经开启,应恢复验证,再根据重新出现的准确错误定位原因。
- 仅一个节点异常:请维护者检查证书有效期、完整中间证书链、SNI 对应虚拟主机,以及续期后服务是否已重新加载。
- 多个节点同时异常:先检查本机时钟、系统更新和当前网络。公司网络、安全软件的 HTTPS 检查可能改变证书信任路径,但需要证据,不能仅凭报错就认定存在拦截。
- 换网络后恢复:检查原网络是否需要网页认证、DNS 是否解析到预期入口,以及网络策略是否影响 TLS。不要为了连接而安装来源不明的根证书。
- 私有证书场景:仅在有明确管理要求、可确认签发者和证书来源时,按管理员方案配置信任;普通订阅用户应先向提供方确认配置。
本篇主要针对常规 TLS 证书验证。若节点安全类型为 REALITY,应进一步核对服务端给出的服务器名称、公钥、短标识及客户端内核支持情况,不能照搬普通证书续期的处理方式。v2rayNG 使用 Xray 内核,v2flyNG 使用 V2Fly 内核,两者可接受的协议和安全参数并不完全相同,不能只改客户端名称就认为配置必然兼容。
恢复连接后的复查与常见问题
每次修改后都应重新建立连接,并观察新的日志。旧连接仍在使用、订阅更新覆盖了手动参数,都会让结果看起来前后矛盾。不要一次修改时间、SNI、DNS 和路由;每一步记录修改项及新错误,才能知道究竟是哪项生效。
时间已经同步,为什么还说证书过期?
对照报错中的当前时间与证书到期时间。如果本机时间正确且证书确实过期,把经过遮蔽的错误和发生时间交给维护者,要求检查续期结果与正在使用的证书。
浏览器打开域名正常,为什么客户端还报错?
浏览器可能连接了不同端口、不同入口或使用不同信任库。对照节点地址、端口及 SNI,不要把浏览器能打开首页当成代理入口证书一定正常的证据。
改完 SNI 能用,更新订阅后又失败怎么办?
重新编辑节点,确认字段是否被订阅覆盖。向提供方反馈订阅中的 TLS 参数;需要临时对照时可保留独立测试配置,但后续应以修正后的订阅为准。
关闭验证才能连接,是否说明排查结束?
不能。重新关闭“跳过证书验证”,按错误类别修复时间、名称或信任链。只有启用正常验证后仍能重新连接,才算解决了原来的证书问题。
- 确认系统自动时间同步有效,日期与时区显示正确。
- 确认节点 TLS 名称与服务端资料一致,证书验证未被跳过。
- 停止后重新连接,确认新日志不再出现同类证书错误。
- 若仍失败,提交客户端及内核版本、发生时间、已检查项目和遮蔽后的底层错误,避免直接发送整份订阅。