用工具测端口是通的,浏览器却报无法建立安全连接,抓包看到握手阶段中断。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

openssl s_client -connect example.com:443 -tls1_2 -servername example.com
# Nginx
ssl_protocols TLSv1.2 TLSv1.3;

服务端只允许较新的协议版本,或加密套件与客户端支持的集合没有交集。这一点先确认清楚,后面就不用反复试。

「TLS 握手失败」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

具体做法是,确认服务端支持的协议版本;放开兼容范围;排查中间设备是否拦截了握手。

改完照着核一遍,主流客户端均能完成握手,旧客户端按需放开协议。

作者 9823189