这个坑值得记一笔。阿里云 2 核 4G 的 CentOS 7.9,nginx 1.20 配了 ssl_protocols TLSv1.2 TLSv1.3,新浏览器正常,一批 Android 6 的采集终端连不上,报 SSL_ERROR_PROTOCOL_VERSION_ALERT,nginx 日志里是 no shared cipher。
刚开始盯着「ssl_ciphers 只配了 1.3 的套件,1.2 没有可用项」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。老客户端只支持 TLS 1.0 或 1.1,服务端已经关掉;客户端 OpenSSL 版本太老,不认 1.3 的 cipher suite;中间设备不支持 1.3,握手被直接重置。
第一件事是确认客户端能谈到哪个协议版本
openssl s_client -connect example.com:443 -tls1_1 </dev/null
接着列出服务端可用的 1.2 加密套件
openssl ciphers -v 'ECDHE+AESGCM:ECDHE+CHACHA20' | head
再往下在 nginx 里补上 1.2 的 cipher 配置
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
剩下的就是检查语法并平滑重载
nginx -t && nginx -s reload
中途换过一次思路,把范围缩到最小的那一层,反而快了。
怎么算真的好了,看的是同一批现象。老终端能完成握手并上报数据,openssl s_client -tls1_2 返回 Verify return code 0,新客户端仍然走 1.3。
这里还有个坑。关掉 1.0 和 1.1 是合规要求,老设备要么升级固件,要么单独留一个入口,别为了兼容把整站降级。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
