本文速览
本文适合遇到 certificate、x509、handshake、unknown authority 等日志的 v2rayN、v2rayNG 与 v2flyNG 用户。排查顺序是先保留原始日志,随后检查系统时间和时区,再核对 SNI,最后验证证书有效期与证书链;allowInsecure 只用于短时定位问题,不应作为长期修复方案。
TLS 报错发生在哪一步
VMess 或 VLESS 节点启用 TLS 后,客户端并不是一连接服务器就开始传输代理数据。它需要先建立 TCP 连接,再发送 TLS ClientHello,其中可以包含 SNI、支持的 TLS 版本与 ALPN,服务器随后返回证书链并协商会话密钥。只有握手成功,后续的协议认证和传输数据才会进入加密通道。
解析节点地址建立 TCP发送 SNI校验证书进入代理协议
因此,“节点连不上”并不等于节点账号失效。如果日志已经出现证书过期、主机名不匹配或未知签发机构,故障位置通常早于 VMess 用户 ID、VLESS UUID、传输路径和路由规则。此时修改订阅分组、系统代理端口或分流规则,通常不会消除证书错误。
排查时应先打开客户端核心日志,而不是只观察浏览器页面。v2rayN 可在主窗口底部日志区查看最近连接,也可通过「设置」→「参数设置」确认日志级别没有被设得过低。v2rayNG 与 v2flyNG 可进入对应配置的运行日志页面,记录首次出现的 TLS 或 x509 原文。
报错:x509: certificate has expired or is not yet valid
原因与解法:本机时间超出证书有效期,或服务端证书确实已过期——先同步系统时间,再查看日志中的当前时间与证书起止日期。
报错:x509: certificate is valid for another.example, not node.example
原因与解法:服务器返回的证书名称与客户端校验名称不一致——核对节点的 SNI,不要把订阅备注、WebSocket 路径或 IP 地址填入该字段。
报错:x509: certificate signed by unknown authority
原因与解法:证书链缺少中间证书,或证书不受系统信任——更新系统证书环境;若多台设备同时复现,应由服务端补齐证书链。
报错:remote error: tls: handshake failure
原因与解法:服务端主动拒绝握手,常见于 SNI、TLS 版本或 ALPN 不匹配——先核对订阅原始参数,再检查服务端监听配置。
第一步检查系统时间与时区
TLS 证书包含 Not Before 与 Not After 两个时间边界。客户端会用设备当前时间判断证书是否已经生效、是否已经过期。系统时间快了数月,会把正常证书判断成过期;系统时间慢了数月,则可能显示证书尚未生效。时区本身不会改变统一时间,但错误的时区与手动时钟组合经常造成实际时间偏差。
±60 秒
建议时钟误差范围
443
TLS 常见服务端口
TLS 1.2+
常见兼容范围
10808
v2rayN 常见本地 SOCKS 端口
Windows 应在系统日期和时间设置中开启自动设置时间与自动设置时区,然后执行一次立即同步。Linux 桌面可先查看系统时间状态,确认 NTP 服务处于同步状态。Android 设备应启用网络提供的日期、时间和时区。修正后需要彻底停止客户端核心并重新启动,避免旧连接继续复用失败状态。
-
保存原始日志
断开当前节点,清理日志后重新连接一次,保存第一条 x509 或 TLS 错误及其时间戳,不要只保留后续的超时信息。 -
核对当前时间
将设备日期、分钟和时区与可信的系统时间源对照,误差尽量控制在 60 秒内,并检查是否误设为手动时间。 -
执行时间同步
开启系统自动同步;Linux 可执行timedatectl status,确认输出中的系统时钟已同步以及时区设置正确。 -
重启客户端核心
在 v2rayN 中先停止服务再重新启动;Android 客户端则断开当前配置,结束连接后重新连接,避免沿用旧会话。 -
比较复测结果
如果报错从 not yet valid 消失,说明根因是本机时间;若仍显示相同的证书截止日期,则继续检查证书是否真的过期。
第二步核对 SNI 与节点地址
SNI 是 TLS ClientHello 中发送的服务器名称。一个 IP 地址可能承载多个站点,服务端会依据 SNI 选择证书和对应的虚拟主机。节点的连接地址可以是域名,也可以是 IP;但证书校验名称通常必须是证书中列出的域名,不能根据备注自行猜测。
例如,客户端连接地址是某个入口 IP,而证书签发给一个域名,此时节点配置需要在 serverName 或 SNI 字段中填写该域名。反过来,如果节点地址本身已经是正确域名,订阅又明确提供了 SNI,就应保留订阅值。把 WebSocket 的 Host、HTTP 路径、订阅名称或节点备注复制到 SNI,都会造成名称不匹配。
| 配置项 | 实际作用 | 常见错误 |
|---|---|---|
| 地址 | 用于 DNS 解析并建立 TCP 连接 | 误填带有协议前缀或路径的完整网址 |
| 端口 | 指定服务端 TLS 监听端口 | 把本地 10808 误填为远端端口 |
| SNI / serverName | 选择服务端证书并确定校验名称 | 填成 IP、节点备注或传输路径 |
| Host | 用于 HTTP 或 WebSocket 请求头 | 认为 Host 必然与 SNI 相同 |
| Path | 指定 WebSocket 或 HTTP 传输路径 | 用路径错误解释证书名称不匹配 |
在 v2rayN 中,可双击目标节点或右键选择编辑服务器,在 TLS 相关区域核对 serverName、SNI 或“伪装域名”字段;具体显示名称会随核心和配置类型变化。修改前先保存订阅原值,修改后只测试这一项,不要同时更换端口、传输方式和 UUID。
在 v2rayNG 或 v2flyNG 中,先断开连接,再点击配置右侧的编辑入口,找到 TLS 安全设置下的服务器名称或伪装域名。若配置由订阅生成,手工修改可能在下次更新订阅时被覆盖,确认正确值后应从订阅提供方修正源配置。
报错:certificate is valid for example.net, not 203.0.113.10
原因与解法:客户端正在按 IP 校验证书——将订阅明确给出的证书域名填入 SNI,同时保留原连接地址,不要关闭校验掩盖问题。
报错:tls: unrecognized name
原因与解法:服务端不接受当前 SNI——恢复订阅原始 serverName;若多个客户端都失败,需要检查服务端虚拟主机与 TLS 监听配置。
第三步判断证书过期与证书链不完整
系统时间和 SNI 都正确后,应检查服务端实际返回了什么证书。证书过期意味着 Not After 已早于当前时间;证书链不完整则常见于服务器只发送站点证书,没有发送必要的中间证书。两者都属于服务端配置问题,客户端重新导入订阅通常不会修复。
在装有 OpenSSL 的 Linux 环境中,可以用下面的命令观察 443 端口返回的证书链。
-connect 后填写实际连接域名与端口,-servername 后填写节点要求的 SNI。测试必须同时保留这两个参数,否则结果可能来自另一套默认证书。openssl s_client -connect server.example:443 \
-servername node.example \
-showcerts
openssl s_client -connect server.example:443 \
-servername node.example \
-verify_return_error < /dev/null
输出中的 subject 是当前证书主体,issuer 是签发者,notBefore 与 notAfter 是有效期。最后一行若显示
Verify return code: 0 (ok),表示当前系统信任环境能够建立完整验证路径。代码 10 通常指证书过期,代码 20 或 21 常见于无法取得本地签发者或无法验证首张证书。- 只有一台设备报错:优先更新系统时间、系统证书环境和客户端核心,再排除本地网络对 TLS 的干扰。
- Windows 与 Android 同时报错:更可能是证书过期、SNI 配错或服务端证书链缺失。
- 同一服务器仅一个域名报错:检查该域名对应的证书绑定和虚拟主机,不要直接修改全部节点。
- 更换网络后恢复:比较两张网络下解析到的 IP,并检查是否存在 DNS 解析异常或透明代理干预。
- 证书刚续期仍报旧日期:确认所有入口服务器都已加载新证书,并重启或重新加载对应的 TLS 服务。
allowInsecure 能解决什么,风险在哪里
allowInsecure 的作用是允许客户端接受无法通过正常验证的服务器证书。它可能让过期证书、自签发证书、名称不匹配或不受信任的证书暂时通过,但不会修复服务器证书,也不会自动纠正 SNI、地址、端口或传输配置。开启后,TLS 数据仍会加密,但客户端失去了可靠确认服务器身份的关键步骤。攻击者若能干预网络连接,就可能用另一张证书冒充目标服务器。因此,这个选项适合短时诊断:开启后若连接立刻恢复,可以确认故障集中在证书验证环节;得到结论后应关闭,并修正时间、SNI 或服务端证书链。
保留失败日志临时开启只测一次确认验证故障关闭并修复
v2rayN 中可编辑对应服务器,在 TLS 区域查找 allowInsecure 或“跳过证书验证”。v2rayNG 与 v2flyNG 通常在配置编辑页的 TLS 设置中显示“允许不安全连接”或相近名称。只对当前测试节点调整,不应批量改动全部订阅配置。
按日志结果确定责任位置
一次有效排查应只改变一个变量,并记录修改前后的首条错误。若同时重导订阅、切换核心、改 SNI、开启 allowInsecure 和更换网络,即使连接恢复,也无法判断真正原因。后续订阅更新还可能把问题重新带回来。
建议建立一个最小测试集:固定同一节点、同一网络和同一客户端核心,先同步时间,再核对 SNI,之后验证证书链,最后才临时测试 allowInsecure。测试期间暂时关闭频繁自动切换节点的功能,避免日志混入其他服务器的错误。
同步时间后还是提示证书过期?
查看日志或 OpenSSL 输出中的 notAfter。如果截止日期确实早于当前时间,问题在服务端证书;若客户端看到的日期与服务端公布结果不同,继续检查是否连接到了旧入口 IP。
SNI 应该填节点地址还是 Host?
填写订阅明确给出的服务器名称。没有单独提供时,通常使用证书覆盖的域名,不能仅凭节点备注判断;Host 与 SNI 用途不同,不应强行改成一致。
开启 allowInsecure 后能连,接下来怎么做?
立即保存开启前后的日志,然后关闭该选项。根据具体错误检查证书有效期、名称匹配和证书链,不要让临时诊断配置长期留在订阅中。
更新订阅为什么没有修复证书错误?
订阅只更新客户端收到的节点参数。若服务端仍发送过期证书或缺少中间证书,重复更新不会改变握手结果,应由服务器端更新并重新加载证书。
只有移动网络报握手失败怎么办?
先比较移动网络与其他网络的 DNS 解析结果,再检查系统时间是否由网络自动校准。若证书名称发生变化或返回不同入口,应保存两组日志交叉比较。
最终判断可以压缩为三条:时间错误由本机修正;SNI 错误按订阅与证书域名修正;多个设备都收到过期证书或不完整证书链,则由服务端处理。只有先把这三类问题分开,TLS 握手失败才不会被误判成端口、UUID、订阅或路由分流故障。