现象
curl 报 (35) error:0A000410:SSL routines::sslv3 alert handshake failure;浏览器报 SSL_ERROR_SSL 或 ERR_SSL_VERSION_OR_CIPHER_MISMATCH;握手在收到任何 HTTP 响应之前就失败;同一主机部分客户端能连、部分不能。
诊断
带 SNI 执行详细握手并检查证书:
openssl s_client -connect example.com:443 -servername example.com -tls1_2 </dev/null 2>&1 | grep -E 'subject=|issuer=|Verify return code|Protocol|Cipher|alert'
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName
curl -vI https://example.com 2>&1 | grep -E 'TLS|SSL|subject|issuer|HTTP/'
-servername 不可省略,否则共享负载均衡可能返回默认证书。Verify return code: 0 (ok) 表示本机信任链验证通过;非 0 会直接说明是证书过期、域名不匹配还是缺少中间证书。握手过程中出现 alert,则更像协议版本或加密套件无法协商。nmap --script ssl-enum-ciphers -p 443 example.com 可列出服务端支持的版本与套件。
修复
配置完整证书链(叶子证书加中间证书),为 SNI 虚拟主机绑定正确证书,并启用双方都支持的 TLS 1.2/1.3。证书过期应续期,客户端时间偏差要校正;mTLS 场景需下发客户端证书并在服务端信任其 CA。不要为兼容单个老旧客户端而重新启用 TLS 1.0 或弱套件,也不要用 curl -k 掩盖信任问题。
验证
重新执行 openssl s_client,确认 Verify return code: 0 (ok) 且协议与套件符合预期;从最初失败的客户端和一台干净主机分别用 curl 验证,最后在开启证书校验的情况下完成真实业务请求。若只有单一客户端失败,应比较其信任库与系统时间,而不是降低服务端安全配置。