openssl s_client -connect example.com:443 -servername example.com
curl -v --max-time 15 https://example.com

客户端连接报 SSLError: The handshake operation timed out,平均耗时 10.2 秒,用 openssl s_client 连同一地址 0.3 秒就完成。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,客户端走了代理,握手阶段每个往返都可能卡住,而超时值给得很大,一次卡顿就是十秒。证书链过长还会让服务端在发送证书时多传几 KB,弱网下把延迟放大。

「SSL 握手超时」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

处理上按这个顺序:先用 openssl s_client 验证服务端本身是否正常;对比走代理和不走代理的握手耗时;检查证书链只保留必要的一级;给握手单独设一个 5 秒上限。

改完只确认一件事:去掉多余中间证书后握手耗时从 10 秒降到 0.4 秒,客户端 SSLError 归零。

作者 9823189