适用于 v2rayN、v2rayNG 使用普通 TLS 节点时出现的证书与握手错误。先用日志区分证书验证失败和网络超时,再校准系统时间、核对 SNI,最后检查证书链与 ALPN。每次只改一项并重新连接,能够避免把服务端证书问题误判为客户端配置问题。
1. 先区分证书报错与握手超时
TLS 握手发生在代理协议交换业务数据之前。客户端先连接服务器,再发送握手参数,验证服务器身份,协商加密连接;其中任何一步失败,都可能在外层日志里表现为“连接失败”。因此不能只读最后一行,需要向前找到包含 x509、tls 或具体网络错误的原因链。
在 v2rayN 主窗口底部的日志区域,记录一次失败连接的时间与节点名称。在 v2rayNG 主界面菜单中打开「日志」,重新连接后查看新增记录。不同版本的入口名称可能略有变化,但排查目标一致:找到同一次连接中最具体的底层错误,而不是反复读取“所有重试失败”的汇总提示。
报错:x509: certificate has expired or is not yet valid
原因与解法:本机时间不在证书有效期内,或者服务器证书确实过期;先同步设备时间,再核对日志中的有效期,不能仅凭这句判断是哪一端的问题。
报错:x509: certificate is valid for example.com, not edge.example.net
原因与解法:示例中用于验证的名称与证书覆盖的域名不一致;核对节点提供的 SNI,并检查服务端是否返回了正确站点的证书。
报错:x509: certificate signed by unknown authority
原因与解法:证书无法建立到受信任根的验证链;检查服务端中间证书是否完整,并排查本机信任库过旧或网络中的证书替换。
报错:i/o timeout
原因与解法:某次网络读写超过等待时间;结合前文判断发生在拨号还是握手阶段,再检查地址、端口、防火墙和服务状态,不能直接归因于 SNI。
2. 系统时间不同步:先校时,再重连
证书具有生效时间和失效时间。设备日期偏到几个月以前,可能得到“尚未生效”;偏到未来,则可能得到“已经过期”。TLS 验证比较的是实际时间点,时区显示不一致并不必然代表系统时钟错误;但手动调整时区后又手动修改钟点,容易造成实际时间偏移。
- Windows 11:进入「设置」→「时间和语言」→「日期和时间」,打开「自动设置时间」,确认时区后点击「立即同步」。同步成功后检查年份、日期与分钟数。
- 查看同步状态:在终端运行下方查询命令,关注时间源与最近一次成功同步时间。需要强制重新同步时,以管理员权限运行第二条命令。
- 安卓:进入系统「设置」→「系统」→「日期和时间」,启用「自动设置时间」与自动时区;部分设备将入口放在「更多设置」。重新联网后确认时间已经更新。
- 复测:断开并重新连接当前节点,再生成一条请求。校时不会自动修复已经失败的连接,需要读取新日志确认结果。
w32tm /query /status
w32tm /resync
如果 Windows 提示时间服务未启动,先在「服务」中检查 Windows Time 的状态;单位管理的电脑应遵循管理员配置的时间源,不要随意替换。如果每次关机后日期都回退,还应检查设备固件时钟和硬件状态。时间已正确而错误仍然指向过期证书时,应由服务端续期证书并重新加载服务。
判断:时间恢复后仍过期,就转查服务端
确认设备当前时间位于证书有效期之外,且时间同步正常时,把日志中的失效日期交给节点维护方;继续切换本地路由规则不能延长证书有效期。
3. SNI 与 serverName:核对域名,不照抄连接 IP
SNI 是客户端在握手时提交的服务器名称,帮助同一地址上的服务选择证书和站点。常规配置中的 tlsSettings.serverName 通常同时用于发送 SNI 与验证证书名称。它不等同于节点连接地址,也不等同于 WebSocket 的 HTTP Host;三者可能相同,也可能由服务端部署决定为不同值。
| 字段或概念 | 作用 | 检查重点 |
|---|---|---|
| 服务器地址 | 决定实际连接的主机或 IP | 地址可解析,端口与节点说明一致 |
| SNI / serverName | 选择 TLS 站点并参与证书名称验证 | 使用节点提供的域名,不带协议与路径 |
| 证书 SAN | 列出证书允许验证的名称 | 必须覆盖客户端验证的目标名称 |
| WebSocket Host | 参与 HTTP 请求与反向代理分流 | 按传输配置填写,不能替代 SNI |
在 v2rayN 中双击目标服务器行,进入节点编辑窗口,检查 TLS 相关区域的「SNI」或「服务器名称」;在 v2rayNG 中点击节点编辑图标,检查 TLS 区域的对应字段。字段名称会随版本和节点类型变化,应以订阅提供的配置为准,不要把连接地址、伪装域名和 SNI 机械地改成同一个字符串。
- 填写裸域名,例如
edge.example.com,不要填写https://edge.example.com/,也不要附加:443。 - 如果节点通过 IP 连接、证书却签给域名,通常仍需要填写提供方指定的域名;不要直接用该 IP 替换 SNI。
- 通配符证书
*.example.com通常覆盖edge.example.com,不覆盖example.com或a.edge.example.com。 - 订阅更新可能覆盖手工修改。临时测试前先复制节点并明确标注,避免下一次更新后丢失排查记录。
下面只展示普通 TCP + TLS 的 streamSettings 片段,不是可独立运行的完整配置。示例域名用于解释字段,实际应替换为节点提供的值;使用 WebSocket 或其他传输时,应保留原有传输类型与对应设置。
{
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"serverName": "edge.example.com",
"allowInsecure": false
}
}
}
4. allowInsecure 与证书链:保留身份验证
allowInsecure 不是“兼容模式”或“加速开关”。在普通 TLS 配置中,将它设为 true 会跳过关键的证书验证,让过期、名称不符或不受信任的证书不再被正常拦截。这可能掩盖问题,却不能证明连接到了预期服务器,也不能修复网络超时。
在节点编辑界面检查「跳过证书验证」或「允许不安全连接」,日常配置应关闭,对应 allowInsecure: false。若旧配置曾打开该选项,恢复验证后出现证书报错,应继续按报错查证,而不是把开关再打开作为长期处理。
- 名称不符:先核对 SNI;若值正确,则服务端可能加载了默认站点证书,需要检查虚拟主机配置。
- 未知签发者:服务端应提供完整中间证书链。公开受信任证书通常不需要用户额外导入私人根证书。
- 仅一台旧设备失败:更新系统与受支持的客户端版本,检查系统信任库;不要为了单个节点导入来源不明的根证书。
- 切换网络后证书变了:检查公共网络登录页、企业代理或安全软件的 HTTPS 检查功能,必要时联系网络管理员确认。
5. ALPN 与超时:按服务端传输要求设置
ALPN 用于在 TLS 握手中协商应用层协议,常见值为 h2 和 http/1.1。它既不是节点协议名称,也不是越多越好的选项。基于 HTTP/2 的 gRPC 传输需要相应的 HTTP/2 支持;传统 WebSocket Upgrade 常使用 HTTP/1.1,具体取决于服务端和反向代理的部署。
- 先核对节点传输类型,再按提供方说明填写 ALPN;没有明确要求时,不要为了尝试而强行限定为单一协议。
- 若日志出现
tls: no application protocol,检查客户端提供的 ALPN 是否与服务端允许的协议存在交集。 - 如果日志只有超时,先确认实际服务器端口。例如节点配置为
8443时,测试443成功并不能证明该节点可用。 - 保持节点参数不变,分别用当前网络与另一条可用网络复测;两者结果不同,优先排查网络路径与访问限制。
Windows 可使用下面的命令测试到指定端口的 TCP 连通性。示例域名与端口仅演示命令格式,应改为节点实际值。TcpTestSucceeded: True 只说明 TCP 能建立连接,并不证明 TLS 证书、ALPN 或代理认证已经正确。
Test-NetConnection -ComputerName edge.example.com -Port 443
判断:TCP 可达不等于 TLS 可用
端口测试成功后仍出现证书错误,应回到时间、SNI 和证书链;端口测试失败时则先查地址与网络,不要同时改动 ALPN、传输路径和认证参数。
6. 常见疑问与恢复后的验证
电脑时间只差几分钟,也会失败吗?
如果恰好接近证书的生效或失效边界,几分钟也可能影响验证。先运行时间同步并重新连接,再查看新日志;不要通过手动拨慢时间绕过已经过期的证书。
浏览器打开域名正常,为什么节点仍报错?
浏览器可能访问了不同端口、不同地址或不同站点。对照节点实际连接地址、端口和 SNI;浏览器中证书正常只能作为线索,不能代替对节点握手的验证。
重装 v2rayN 能修好证书问题吗?
重装不会修正服务器证书过期、SNI 填错或本机时间偏差。先保存具体报错;只有旧版本兼容性或本地文件异常得到证实时,再考虑更新客户端并导入正确配置。
安卓失败、桌面正常,应该先改什么?
先确认两端使用同一节点、同一 SNI 和相同传输参数,再比较自动时间设置与系统更新情况。让两端连接同一网络复测,可以减少网络差异对结论的干扰。
完成修正后,重新连接节点并发起一次真实访问,确认新增日志不再包含证书验证或握手错误,再检查应用访问是否恢复。若 TLS 已完成但仍然不能访问,应继续检查代理协议认证、传输路径和路由设置,不要反复修改已经验证正确的 SNI。
- 保留排查记录:写下客户端版本、内核版本、失败时间、网络环境和具体报错,不要只描述“连不上”。
- 恢复安全配置:确认跳过证书验证处于关闭状态,并删除为了试错增加的无依据参数。
- 提交必要信息:向维护方提供证书报错与端口情况;对外分享日志前,隐藏订阅地址、认证信息和个人网络地址。