tls-handshake-failed

TLS 握手失败的定位与修复

现象

客户端报 SSL_ERROR、tls: handshake failure、no shared cipher、certificate verify failed 或连接直接断开。浏览器可能显示“无法建立安全连接”。

快速定位

openssl s_client -connect <host>:443 -servername <host>
openssl s_client -connect <host>:443 -servername <host> -tls1_2
curl -v https://<host>/
openssl x509 -in cert.pem -noout -subject -issuer -dates
nmap --script ssl-enum-ciphers -p 443 <host>
date -u

常见根因

  1. 证书过期、域名不匹配或证书链不完整。
  2. 客户端不信任签发 CA,或系统 CA 库过旧。
  3. 客户端和服务端支持的 TLS 版本/加密套件没有交集。
  4. 未发送 SNI,服务端返回了错误证书。
  5. 系统时间偏差过大,证书校验失败。
  6. 中间代理、WAF 或抓包工具替换了证书。

修复

相关命令

读完自测

合上页面,先回答,再展开对照。

  1. curl -k 能通但浏览器报证书错误,常见原因有哪些?
  2. 如何判断握手失败是 TLS 版本/套件没有交集?
  3. 系统时间偏差会导致 TLS 握手失败吗?
答案
  1. 常见于证书过期、域名不匹配、证书链不完整,或客户端不信任签发 CA。可核对 subjectAltName 并补中间证书。
  2. 用 openssl s_client -connect <host>:443 -servername <host> 看握手停在哪一步。再用 -tls1_2 或 nmap --script ssl-enum-ciphers 验证版本与套件。
  3. 会。证书校验依赖时间,页面把“系统时间偏差过大”列为根因。可用 date -u 检查并校准时间。