适用于节点使用普通 TLS、客户端日志出现握手失败或 x509 证书错误的情况。按“日志原文 → 系统时间 → 连接地址与 SNI → 证书链 → 客户端字段”检查,区分网络超时与证书验证失败,保留证书验证开启状态,并用单项修改后的日志确认结果。
先区分证书错误与连接失败
“TLS 握手失败”是阶段描述,不是唯一原因。客户端先连接节点地址和端口,再进行 TLS 协商与证书验证,之后才进入代理协议交互。连接超时、服务端主动断开、证书域名不符,可能都被上层汇总为连接失败。排查时应展开内核日志,读取错误链的最后一层,而不是只看测速列表中的失败标记。
v2rayN 可从主界面的日志区域读取本次连接记录;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 数据,可能连到了明文服务。解法:核对节点端口、传输安全设置及反向代理监听配置。
报错:context deadline exceeded
原因:操作超过时限,单凭这句不能判断证书有问题。解法:结合前后日志检查域名解析、TCP 可达性和握手阶段,不先修改证书选项。
系统时间:先同步,再判断证书是否过期
证书包含生效时间和到期时间。设备时钟过早可能触发“尚未生效”,过晚可能触发“已经过期”。仅切换时区通常不会改变真实的系统时间戳;需要修正的是实际日期与时间。双系统切换、长期关机后开机或自动时间同步失败,都值得优先检查。
-
同步时间
Windows 11:打开「设置」→「时间和语言」→「日期和时间」,开启「自动设置时间」,在「其他设置」中点击「立即同步」。若同步失败,先解决设备的网络连通问题。
-
核对其他设备
macOS:进入「系统设置」→「通用」→「日期与时间」,开启自动设置日期与时间。Android:进入系统「设置」→「系统」→「日期和时间」,开启自动时间;厂商系统可能将入口放在「更多设置」。
-
重新发起连接
同步后停止并重新启动客户端连接,记录新产生的错误。不要沿用时间修正之前的旧日志判断修复是否有效。
-
检查证书期限
若设备时间已正确,仍提示过期,检查实际收到的证书有效期。证书续期后还需让 TLS 终止服务重新加载,磁盘上的新文件不代表当前连接已使用新证书。
连接地址、SNI 与 Host 不能混填
节点编辑页中的“地址”决定连接到哪里;SNI 是 TLS ClientHello 中提交的服务器名称,服务端常用它选择证书;WebSocket 的 Host 属于握手之后的 HTTP 请求头。三者可能使用同一个域名,也可能不同,但必须遵循服务端配置,不能把“伪装域名”当成任意可换的装饰字段。
| 设置项 | 作用阶段 | 检查重点 |
|---|---|---|
| 地址与端口 | 建立网络连接 | 使用服务端提供的入口;域名解析结果应指向预期服务。 |
serverName / SNI | TLS 握手 | 填写证书覆盖的服务名,不带协议、端口或路径。 |
| WebSocket Host | HTTP 升级请求 | 匹配反向代理虚拟主机;不能替代 TLS 的 SNI。 |
| WebSocket path | HTTP 路径匹配 | 使用服务端约定路径;路径错误通常不是证书域名错误。 |
allowInsecure | 证书验证 | 普通公开证书场景保持 false。 |
以保留用于文档的域名 edge.example.com 为例:如果证书的 Subject Alternative Name 包含该名称,SNI 应填这个主机名,而不是 https://edge.example.com/path。通过 IP 连接时,也可明确指定服务端要求的域名作为 SNI。若直接按 IP 验证,证书需要包含匹配的 IP 地址项,只有域名项并不够。
判断:按服务端参数核对,不按端口猜协议
端口号只是惯例。先确认节点实际启用了普通 TLS,再核对 SNI 与证书域名;只改 WebSocket Host 无法修复发生在 HTTP 请求之前的证书名称错误。
客户端中的 SNI 与 allowInsecure 检查位置
界面名称会随版本变化,下面以节点编辑入口和实际字段为定位依据。订阅导入的参数还可能在更新时被覆盖,修改前应复制一个节点用于排查,记录原值。不要在一次测试中同时改地址、端口、SNI 和传输方式,否则即使恢复连接也难以确定原因。
- v2rayN:在主界面双击目标节点,打开服务器编辑窗口。检查「地址」「端口」,再检查传输层安全相关区域的
tls、「SNI」和「跳过证书验证」或「允许不安全连接」项。普通 TLS 场景下,后者应关闭。使用自定义配置时,以实际加载的 JSON 为准,普通编辑窗口未必会改动该文件。 - v2rayNG:在节点列表点击目标节点的编辑图标,向下查看 TLS 设置。确认传输层安全为
tls,核对「SNI」与「允许不安全连接(allowInsecure)」;若使用 WebSocket,再单独检查传输设置中的 Host 和 path。该客户端使用 Xray 内核,REALITY 节点应按对应字段排查。 - v2flyNG:从节点列表进入编辑页,检查 TLS、服务器名称或 SNI,以及允许不安全连接项。该客户端使用 v2fly 内核,不应照抄 Xray 专有的安全设置;若当前编辑页没有对应字段,应核对节点类型和所用版本,而不是把值填入 Host 代替。
下面是普通 TLS 的 streamSettings 配置片段,用于辨认字段,不是完整节点配置。示例采用 TCP 传输,域名仅用于说明;现有节点若为 WebSocket 或其他传输,不要为了照抄示例而改成 TCP。最终字段支持范围以实际运行的内核为准。
{
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"serverName": "edge.example.com",
"allowInsecure": false
}
}
}
证书链与 SNI:用独立握手缩小范围
有终端工具的环境,可以在同一台设备、同一网络下独立观察服务端返回的证书。以下命令要求系统已安装 OpenSSL;执行前将示例主机名、SNI 和端口换为实际参数。连接地址与 SNI 分开传入,尤其适合检查“通过 IP 连接、按域名验证”的配置。
openssl s_client -connect edge.example.com:443 -servername edge.example.com -showcerts -verify_hostname edge.example.com -verify_return_error
- 先看是否收到证书:如果连接建立前就超时,应先查网络、DNS、端口与防火墙;没有证书输出不能直接判定为证书过期。
- 再看名称与期限:检查返回证书的域名项、生效时间和到期时间。SNI 选到了默认站点证书时,应核对服务端虚拟主机与证书绑定。
- 检查证书链:服务端通常应发送叶证书与必要的中间证书,根证书由客户端信任库提供。浏览器能访问不代表所有内核都能建立同样的信任链。
- 比较信任环境:OpenSSL 与客户端内核可能使用不同的信任库。命令成功只能证明该工具、当前目标和参数下的结果,不能取代客户端重测。
若只在某个网络中收到不同颁发者的证书,应检查该网络是否存在 HTTPS 检查、门户登录或流量转发。不要从报错弹窗中随意安装未知根证书。服务端由他人管理时,提交经过脱敏的错误末行、发生时间、SNI 和端口即可,不要附带订阅完整地址、UUID 或其他凭据。
常见问题与修复后的验收
开了 allowInsecure 就能连,是否可以一直开着?
这只说明常规证书验证环节值得重点检查,不代表已经确认是域名问题。同步时间,核对 SNI、证书有效期和完整链;修复后关闭该选项,再发起实际请求确认。
浏览器能打开节点域名,客户端为什么还报错?
先核对两者是否访问同一地址、端口与 SNI。浏览器可能走不同代理或解析到不同入口,使用的信任库也可能不同。以客户端实际连接和收到的证书为准。
订阅更新后 SNI 又变回去了,怎么办?
保留单独的测试副本,确认修改确实有效后联系订阅提供方修正下发参数。每次更新后核对原节点,避免把自动覆盖误判为客户端没有保存。
节点是 REALITY,也检查这些 TLS 项吗?
先确认 security 的实际值。REALITY 不能直接套用普通 TLS 的证书修复流程,应核对服务端要求的 serverName、公钥和 shortId 等对应参数,不要改成普通 TLS 或开启跳过验证碰运气。
完成修改后,先保存节点并重启连接,再使用同一请求复测。验收不只看延迟数字:日志中应不再出现原证书错误,实际请求应能完成,普通 TLS 节点的证书验证仍保持开启。若握手通过后出现路径错误、HTTP 状态码异常或协议认证失败,应转查传输路径与账户参数,不再反复更改 SNI。