GTmetrix检测网站遇SSL异常:cURL error 35及握手失败求助
我之前帮朋友排查过一模一样的GTmetrix测试报错,这种SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure本质是你的服务器SSL/TLS配置和GTmetrix的测试环境不兼容导致的,换测试地点或重试通常解决不了核心问题,给你整理几个针对性的排查修复步骤:
检查并更新TLS协议版本支持
GTmetrix的测试服务器已经淘汰了旧的SSLv3、TLS1.0和TLS1.1协议,你需要确保服务器只启用现代TLS版本:- Nginx配置示例:
ssl_protocols TLSv1.2 TLSv1.3; # 只保留TLS1.2和1.3 - Apache配置示例:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 # 禁用旧协议
修改后记得重启Web服务器。
- Nginx配置示例:
调整密码套件为现代兼容版本
过时的密码套件也会导致握手失败,建议使用GTmetrix支持的主流套件:- Nginx推荐配置:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # 让客户端选择更优的套件
- Nginx推荐配置:
验证SSL证书链完整性
证书链不完整是常见的握手失败原因,你需要确保服务器配置了完整的证书链(包含根证书和中间证书):- Nginx中通过
ssl_trusted_certificate指定完整的证书链文件; - Apache新版本可以直接将中间证书追加到域名证书文件中,旧版本用
SSLCertificateChainFile指定中间证书路径。
可以用openssl s_client -connect yourdomain.com:443命令测试,输出中如果出现Verify return code: 0 (ok)说明证书链没问题。
- Nginx中通过
排查防火墙/WAF拦截
有些服务器的防火墙或WAF会拦截GTmetrix的测试IP,或者限制SSL握手请求频率。你可以暂时关闭WAF测试一次,如果测试正常,就需要把GTmetrix的IP段添加到白名单中。确认SNI配置(虚拟主机场景)
如果你的服务器是虚拟主机(多个域名共享一个IP),必须确保开启SNI支持:- Nginx默认支持SNI,无需额外配置;
- Apache需要确保启用
mod_ssl模块,并且每个虚拟主机都正确配置了SSLCertificateFile和SSLCertificateKeyFile。
修复完配置后,先用openssl s_client -connect yourdomain.com:443 -tls1_2和openssl s_client -connect yourdomain.com:443 -tls1_3命令测试握手是否成功,确认没问题后再重新运行GTmetrix检测。
内容的提问来源于stack exchange,提问作者lmfnoah

