本文目录
看到 TLS handshake failed,先保存完整错误和失败阶段
证书错误、系统时间不准和 SNI 配错都会显示成 TLS 握手失败,但修法完全不同。先复制日志里的完整原文,再确认错误发生在订阅下载、代理节点握手,还是打开目标网站;这两项确定后,才知道该查时间、证书链还是节点字段。
常见原文
| 日志文字 | 优先方向 |
|---|---|
| x509: certificate has expired or is not yet valid | 系统时间、证书有效期 |
| x509: certificate signed by unknown authority | 系统 CA、企业 SSL 检查、私有证书 |
| remote error: tls: handshake failure | SNI、协议字段、服务端 TLS 配置 |
| tls: failed to verify certificate: x509 | 证书链、servername 与实际证书名称 |
| EOF / connection reset by peer | 对端提前关闭、网络拦截;不能只凭这一句断定证书问题 |
复制错误前后几行,保留时间、目标域名和端口,但遮住订阅 token、UUID 与密码。只截“TLS failed”会丢掉真正能区分原因的部分。
订阅下载、节点握手和目标网站是三条不同连接
先做一个很简单的对照:现有节点还能不能访问其他 HTTPS 网站,订阅还能不能手动更新。两个结果组合起来,通常就能判断握手失败发生在哪一跳。
Profile 更新报 TLS,现有节点还能用
失败在订阅 URL;检查该域名证书、系统时间和网络检查设备。
只有一个节点报 handshake failure
失败在客户端到代理服务器;比较该节点的 server、port、SNI 与 TLS 字段。
节点能连,只有一个 HTTPS 网站报证书错误
查看目标站证书、浏览器/应用证书库和是否被安全软件解密。
所有节点同时开始 x509 报错
先看系统时间、内核升级和网络是否统一替换了证书。
时间不对时,任何证书设置都会被误判
# Linux
date -R
timedatectl status
# Windows PowerShell
Get-Date
w32tm /query /status证书有 Not Before 与 Not After。双系统切换、虚拟机快照、长期断电的 OpenWrt 或关闭自动校时,都可能让时间偏离。把日期、时区和 NTP 同步恢复后,重新启动 Mihomo 再复现一次;错误仍完全相同才继续检查握手字段。
单个节点失败时,对照 SNI 与服务端证书名称
TLS 节点连接的 server 可能是 IP,证书却签发给域名;这时配置通常需要正确的 servername 或 sni。值必须来自服务端配置,不能从网上猜一个热门域名。端口、传输类型、ALPN、Reality public-key/short-id 等字段也必须成套匹配。
proxies:
# 下列 IP、域名和密码都是占位值,不能直接连接
- name: tls-example
type: trojan
server: 203.0.113.10
port: 443
password: REDACTED
sni: edge.example.com
skip-cert-verify: false在同一网络查看服务器实际返回的证书
openssl s_client -connect edge.example.com:443 -servername edge.example.com -showcerts </dev/null
curl -Iv https://edge.example.com/openssl 输出里看 subject、issuer、有效期与 Verify return code。加与不加 -servername 返回不同证书,说明服务端依赖 SNI;证书在手机热点正常、公司网络却变成企业 CA,则存在 SSL 检查或中间网关。
代理协议端口不一定提供普通 HTTPS 页面,curl 失败并不自动说明节点坏了;openssl 的证书与握手信息更有参考价值。Reality 等协议也不能按普通网站证书逐项套用,应回到对应协议文档。
只有公司网络失败,先确认是否有受管证书检查
企业代理、安全网关和部分杀毒软件会重新签发 HTTPS 证书。受管设备应由管理员安装组织 CA 并说明哪些流量允许检查;个人不要从报错网页下载陌生根证书,也不要为让 Clash 更新成功关闭全系统证书验证。
换手机热点后同一订阅 URL 立即正常,是网络路径差异的证据。把公司网络下的 issuer、错误时间和目标域名交给管理员,比不断换节点更有用。
修复后重复原来失败的那条连接
不要用“别的网站也能打开”代替验证。回到最初报错的订阅、节点或目标网站,用同一网络再试一次,并确认日志里的原错误已经消失。
验证结果
- 系统时间与时区正确,重启内核后不再出现 not yet valid/expired
- 订阅失败时,手动更新成功且更新时间变化
- 节点失败时,同一节点完成握手并产生真实连接记录
- 目标网站失败时,证书 issuer 与域名符合预期
- 临时关闭的证书检查或安全设置已经恢复
- skip-cert-verify 保持 false,除非受控测试有明确理由
