面向遇到「证书过期」「证书名不匹配」「unknown authority」三类 TLS 报错的用户,按系统时间、SNI 与域名匹配、证书链完整度、allowInsecure 四项顺序排查,每项给出 v2rayN 与 v2rayNG 的具体操作位置。
TLS 握手失败的常见报错与排查顺序
TLS 握手是 V2Ray 建立连接的第一步。客户端向服务器发送 ClientHello,服务器返回证书链,本地内核依次校验证书有效期、域名匹配与签发链。任何一环失败,连接都会在握手阶段终止,表现为「已连接但立即断开」或核心日志中的证书错误。v2rayN 与 v2rayNG 使用同一套 Xray 内核,报错格式一致。
排查顺序建议固定为:先读报错原文,再对系统时间,再对域名与 SNI,最后检查证书链。乱序操作最常见的后果是反复切换节点,真正的问题却始终没有变化。
报错:tls: failed to verify certificate: x509: certificate has expired or is not yet valid
原因与解法:设备系统时间与真实时间偏差过大,落在证书有效期之外——打开系统自动时间同步,重启内核后重试。
报错:tls: failed to verify certificate: x509: certificate is valid for v2.example.com, not 203.0.113.10
原因与解法:服务器地址填了 IP,证书只对域名签发——地址栏改回域名,或在 SNI 字段填入证书域名。
报错:tls: failed to verify certificate: x509: certificate signed by unknown authority
原因与解法:服务器未下发中间证书,本地构建不了信任链——服务端改用完整证书链文件,客户端可临时勾选 allowInsecure 验证判断。
三条报错对应三个独立检查点。后续章节按此顺序展开,每节末尾给出 v2rayN 与 v2rayNG 的具体操作路径。
系统时间偏差:expired 与 not yet valid 的第一来源
证书校验以设备本地时间为准。证书内含 NotBefore 与 NotAfter 两个时间边界,本地时间落在边界之外,就会触发「已过期」或「尚未生效」报错。v2rayN 的核心日志面板会打印每次握手的本地时间戳,先比对日志时间与真实时间,偏差超过几分钟即可判定为时间问题。
时间同步只需两步:打开自动时间,再点一次立即同步。虚拟机与双系统用户需额外确认来宾系统时间在恢复运行后已刷新,挂起期间时间会停滞。
Windows 与安卓的时间同步路径
- Windows 11 / 10:设置 → 时间和语言 → 日期和时间,打开「自动设置时间」并点击「立即同步」。
- Android:设置 → 系统 → 日期和时间,打开「自动确定时间」;部分机型入口在「更多设置」下。
- 虚拟机与双系统:恢复运行后先手动同步一次时间,避免挂起或休眠导致时间停滞。
同步完成后重启内核再试。v2rayN 通过「内核」→「重启内核」触发,v2rayNG 关闭再打开连接开关即可。若报错消失,说明问题就是时间偏差。
SNI 与域名匹配:证书名不匹配报错的定位
域名匹配是证书校验的第二步。客户端用「服务器地址」或独立 SNI 字段比对证书中的 CN 与 SAN 列表。地址填 IP 而证书只签给域名时,日志出现 valid for xxx, not yyy 报错。Xray 内核中该字段名为 serverName,图形界面显示为 SNI。
{
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"allowInsecure": false,
"serverName": "v2.example.com"
}
}
}
| 服务器地址 | SNI 字段 | 握手结果 |
|---|---|---|
| v2.example.com | 留空 | 正常,SNI 自动取地址域名 |
| 203.0.113.10 | v2.example.com | 正常,连接走 IP,证书按 SNI 校验 |
| 203.0.113.10 | 留空 | 证书名不匹配,握手终止 |
修法只有两个方向:把地址改回域名,或保留 IP 地址并在 SNI 字段填入证书域名。前者适用于域名可解析的场景,后者适用于域名被污染、需要 IP 直连的场景。v2rayN 中 SNI 位于服务器编辑窗口的 TLS 分组,v2rayNG 在服务器编辑页的 TLS 相关设置中填写。
证书链缺失与 allowInsecure 的正确用法
证书链由叶子证书、中间证书与根证书组成。服务器必须下发叶子与中间证书,根证书由客户端系统信任库提供。中间证书缺失时,客户端无法构建信任链,报 unknown authority。这是服务端配置问题,常见于只把叶子证书写入部署文件的情况。
allowInsecure 的作用是跳过整条证书校验链,包括有效期、域名与签发者。它不会修复证书本身的问题,只让握手通过。临时勾选后若连接成功,说明问题确实在证书侧;随后应回到服务端修复证书,而不是长期保留该选项。
v2rayN 中 allowInsecure 位于服务器编辑窗口的 TLS 分组,勾选后需重启内核生效;v2rayNG 在服务器编辑页的 allowInsecure 开关,切换后需断开重连。数据仍经 TLS 加密,但证书身份不再被验证,中间人可替换证书。
v2rayN 与 v2rayNG 的 TLS 设置对照
下表汇总四个检查点在两款客户端中的入口,按此顺序操作可覆盖绝大多数证书类报错。
| 检查项 | v2rayN | v2rayNG |
|---|---|---|
| 核心日志 | 主界面底部日志面板 | 主界面日志入口 |
| 服务器地址 | 编辑服务器 → 地址 | 编辑服务器 → 地址 |
| SNI | 编辑服务器 → TLS → SNI | 编辑服务器 → TLS 分组 → SNI |
| allowInsecure | 编辑服务器 → TLS → allowInsecure | 编辑服务器 → allowInsecure 开关 |
| 重启连接 | 内核 → 重启内核 | 关闭再打开连接开关 |
报错 certificate has expired,但手机上看时间是对的
先看 v2rayN 日志面板打印的握手时间戳,确认内核读取的本地时间;再检查 Windows Time 服务是否在运行,管理员命令行执行 w32tm /resync 强制同步。
我填了域名还是报 not valid for
确认域名与证书 SAN 完全一致,www 前缀也算不匹配。用浏览器直接访问 https://该域名,查看证书详情中的「使用者可选名称」列表逐一比对。
allowInsecure 勾上就通了,能一直用吗
不建议。它只跳过校验,不修复证书;长期使用应把服务端证书链补全,再改回 allowInsecure 关闭状态。
证书报错只出现在某一个节点
该节点证书配置问题,换节点可临时恢复;同时检查该节点地址是否误填了 IP 而证书只签给域名。
重启内核后还是同样报错
确认服务器列表勾选的是修改后的节点,v2rayNG 重新拉取订阅后再试;部分机型需先同步系统时间再断开重连。