适用于 v2rayN、v2rayNG 与 v2flyNG 中启用普通 TLS 的节点。先保留内核日志中的具体错误,再依次检查系统时间、服务器地址与 SNI、证书链和传输参数。读完可以区分本机设置问题与服务端证书问题,并整理一份可供服务维护者复核的记录;本文不把关闭证书验证作为修复办法。
一、先读完整日志,确认失败发生在哪一层
“TLS 握手失败”只是故障范围,不是唯一原因。一次典型连接需要先解析服务器地址、建立 TCP 连接,再进行 TLS 协商和证书验证,之后才轮到代理协议与上层传输。VMess、VLESS 是代理协议名称,不能单凭协议名称判断证书是否正确。
在 v2rayN 主窗口查看日志区域,必要时进入「设置」→「参数设置」,找到内核日志级别并临时设为 info;不同版本的位置与名称可能略有差异。v2rayNG、v2flyNG 可在应用菜单的日志页面查看内核输出。清空旧日志后只重试一个节点,记录本次连接对应的错误,避免把其他应用的连接失败混进来。
报错:x509: certificate has expired or is not yet valid
原因与解法:本机时间不在证书有效期内,或证书本身已经过期、尚未生效。先核对系统日期与时间,再让服务维护者确认实际部署证书的有效期。
报错:x509: certificate signed by unknown authority
原因与解法:证书链无法连接到客户端信任的根证书,可能是缺少中间证书、使用私有证书或信任库过旧。先确认服务端发送的证书链,不要直接开启跳过验证。
报错:tls: first record does not look like a TLS handshake
原因与解法:连接目标返回了非 TLS 数据,常见于端口或服务类型填错。对照订阅提供方的地址、端口和 TLS 开关检查,不能仅把端口改为 443 就认定修好。
日志中的 i/o timeout、connection refused 或 EOF 不能单独证明证书有问题。前两类应先检查网络可达性与服务监听;单独的 EOF 表示连接提前结束,还需要结合服务端日志定位。向他人提供日志时,应遮盖订阅链接、用户标识和访问令牌。
二、系统时间偏差:先同步,再判断证书是否过期
证书包含生效时间和到期时间。系统日期错误一年会直接越过有效期边界;即使只相差几分钟,也可能在证书刚签发或即将到期时触发验证失败。时区显示不一致不一定意味着时钟错误,判断依据是设备记录的实际时间是否准确,不能只看时区名称。
- Windows:打开「设置」→「时间和语言」→「日期和时间」,启用自动设置时间,点击「立即同步」。检查日期、年份和时区,然后重启客户端内核。
- macOS:打开「系统设置」→「通用」→「日期与时间」,启用自动设置日期与时间。设备从长期休眠恢复后,也应重新核对当前时间。
- Android:在系统设置中搜索「日期和时间」,启用自动设置时间与自动设置时区。确认网络可用,再回到 v2rayNG 或 v2flyNG 重试同一个节点。
- Linux:用
timedatectl status查看时钟同步状态;使用 systemd 的系统可通过sudo timedatectl set-ntp true启用网络时间同步。
Windows 可以先在终端查询同步状态。第二条命令需要以管理员身份执行;如果同步失败,应按系统提示检查时间服务与网络,而不是连续改动节点参数。
w32tm /query /status
w32tm /resync
这些是协议常用端口,不代表你的节点必须使用其中某个端口。网络阻断 UDP 123 可能影响传统 NTP 同步,却不能据此推断代理端口也被阻断。若系统时间已准确,日志仍明确显示证书过期,应由服务端续期并重新加载证书,修改本机日期不是解决办法。
三、SNI、服务器地址与 Host:分别核对三个字段
SNI 是 TLS 握手时发送的服务器名称,用于让同一地址上的服务选择相应证书。v2rayN 节点编辑窗口中的「SNI」或「服务器名称」,通常对应内核 TLS 设置中的 serverName。客户端还会依据配置中的服务器名称验证证书身份,因此不能随意填写一个看起来能打开的网站域名。
| 字段 | 实际作用 | 核对方法 |
|---|---|---|
| 服务器地址 | 决定连接到哪个域名或 IP 地址。 | 与当前有效订阅一致,不带协议前缀和路径。 |
| 端口 | 决定连接目标上的哪个服务。 | 按服务端配置填写,不默认认定为 443。 |
| SNI / serverName | 参与 TLS 服务选择与证书名称验证。 | 使用服务提供方指定且被证书覆盖的域名。 |
| WebSocket Host | 属于 TLS 建立之后的 HTTP 请求头。 | 按反向代理配置填写,不能代替 SNI。 |
| WebSocket 路径 | 让反向代理把请求转到对应后端。 | 逐字核对路径与大小写,和证书域名分开检查。 |
例如,服务器地址可以是一个 IP,而 SNI 是证书覆盖的域名;这两者不必相同。但如果按 IP 验证证书,证书的主题备用名称中需要包含对应的 IP 类型条目,仅有域名条目并不够。普通域名证书则应核对 SAN,也就是主题备用名称,不能只看证书页面的标题。
- SNI 填纯域名,例如
example.com,不要附加https://、端口、斜杠或空格。 *.example.com通常可覆盖a.example.com,不能据此认为它也覆盖example.com或a.b.example.com。- 订阅中的“伪装域名”名称可能指 Host,也可能指 SNI。应确认具体字段用途,不能看到“域名”二字就全部复制成相同值。
结论:证书名称不匹配时,先改对 SNI,不先改 DNS
如果日志已经显示收到的证书与期望名称不匹配,说明连接至少到达了某个 TLS 服务。先核对 SNI、目标地址和证书 SAN;只有怀疑解析到了错误服务时,再检查 DNS 结果。
四、证书链不完整:浏览器能打开不代表内核能通过
服务端通常需要发送站点证书及必要的中间证书,客户端再用自己的信任根完成验证。浏览器可能拥有缓存的中间证书,或使用不同的信任机制,因此“同一域名在浏览器打开正常”只能作为线索,不能排除服务端证书链配置错误。
- 先看影响范围:同一节点在多台时间准确的设备上都报未知颁发机构,优先让维护者检查部署证书与中间证书。
- 再看设备差异:只有旧系统失败时,检查系统更新和信任根状态,同时记录客户端与实际使用的内核版本。
- 检查网络干预:若仅在单位网络或启用了 HTTPS 检查的安全软件环境出现,应联系网络管理员确认是否存在证书替换。
- 处理私有证书:只在明确受控的部署中按管理要求配置可信证书;不要导入来源不明的根证书。
具备命令行环境时,可以用 OpenSSL 观察服务端返回的证书。下面使用保留示例域名,只演示命令结构;实际排查时应将两个域名分别替换为节点连接地址和预期 SNI,端口也按节点填写。
openssl s_client -connect example.com:443 -servername example.com -showcerts -verify_hostname example.com -verify_return_error
-servername 用来发送 SNI,-verify_hostname 用来指定验证名称,两者用途不同。此命令的信任库可能与客户端内核不同;若本地 OpenSSL 没有正确配置可信 CA,命令报错也不能直接判定服务端故障。复核时重点记录返回证书的 SAN、有效期和链条,不要只截最后一行。
五、跳过证书验证:保持关闭,修复实际配置
“允许不安全连接”“跳过证书验证”一般对应 allowInsecure。开启后,客户端可能不再拒绝不可信或名称不匹配的证书,但这并没有修复证书;连接对象的身份失去了正常验证。它也不能修复 TCP 超时、端口填错、WebSocket 路径错误或代理认证失败。
下面是普通 TLS 出站的 streamSettings 局部示意,不是可直接导入的完整配置,也不适用于 REALITY。example.com 只用于说明字段关系,实际值必须来自服务端配置,不能直接拿示例域名连接节点。
{
"streamSettings": {
"security": "tls",
"tlsSettings": {
"serverName": "example.com",
"allowInsecure": false
}
}
}
- 保存后重启内核,确认本次运行确实读取了新配置。
- 若日志仍显示旧域名,检查当前选中的节点、订阅分组,以及编辑的是否为正在使用的配置。
- 不要直接修改临时生成文件后期待永久生效;客户端下一次启动或更新节点时可能重新生成该文件。
六、证书通过后仍失败:检查传输层与服务端记录
证书验证成功并不等于代理连接已经成功。WebSocket 的路径和 Host、gRPC 的服务名称、代理协议的用户标识,都在各自阶段参与通信。若日志从 x509 错误变为 HTTP 状态错误或认证失败,应按新错误继续排查,而不是再开启跳过验证。
报错:websocket: bad handshake
原因与解法:WebSocket 升级请求没有得到预期响应,可能是 Host、路径或反向代理转发配置不一致。核对节点传输设置,并让维护者查看对应时间的 HTTP 访问记录。
报错:remote error: tls: handshake failure
原因与解法:远端中止 TLS 协商,可能涉及 SNI 策略、协议兼容性或服务端认证要求。客户端这一行不足以定因,应结合服务端握手日志核对,不能直接归咎于本机证书库。
每次只改一个字段,再对同一节点重试。若同时更换 DNS、SNI、内核和端口,即使恢复连接,也很难判断哪一步有效。升级客户端或内核前保存配置,并确认节点需要的协议与传输类型受支持;不要为了消除某条报错盲目切换内核。
- 本机记录:操作系统、客户端版本、内核名称与版本、系统时间同步结果。
- 节点记录:连接地址类型、端口、TLS 类型、SNI、传输类型;用户标识与订阅凭据需要遮盖。
- 日志记录:一次失败的准确时间和完整错误链,注明是在连接阶段、证书验证阶段还是传输阶段失败。
- 服务端核对:当前证书有效期、SAN、中间证书部署,以及续期后相关服务是否已经重新加载。
七、常见问题:按错误范围选择下一步
时间已经同步,为什么还提示证书过期?
先确认报错来自刚刚重试的节点,而不是旧日志。核对客户端实际收到的证书有效期;服务端可能已续期文件,却没有重新加载服务,也可能只更新了部分入口。把失败时间、连接地址和证书到期时间交给维护者核对。
服务器地址是 IP,SNI 就必须填 IP 吗?
不必。连接地址决定数据发往哪里,SNI 通常填写服务提供方指定的证书域名。若改用 IP 作为验证名称,证书需要包含匹配的 IP 类型 SAN。不要把 WebSocket Host 当成自动替代 SNI 的设置。
开启跳过验证后能连,是否可以一直开着?
这只能提示问题与证书验证有关,不能证明连接对象可信。将该选项恢复关闭,再按有效期、名称匹配、证书链的顺序检查。若源订阅反复写入错误设置,应联系提供方修正,而不是反复绕过验证。
所有节点都握手超时,是不是证书同时坏了?
不应仅凭超时下结论。先核对系统网络和时间,再检查客户端是否实际发起连接、目标端口是否可达,以及日志是否明确出现 x509 错误。可在获准使用的另一网络中对同一节点复测,用网络差异缩小范围。