用 s_client 看清一次 TLS 握手
证书链、SNI、协议版本,命令行里全都能看到。
为什么要手动握手
浏览器把 TLS 握手包装得很好,出问题时也只给一句笼统的提示。s_client 的价值在于把握手拆开,让你看到服务端实际下发了哪张证书、协商到了哪个协议版本、链是否完整。
连一个域名,最常用的一条命令是:openssl s_client -connect example.com:443 -servername example.com。这里的 -servername 很关键,它决定了 TLS 握手里带的 SNI,而 SNI 决定服务端返回哪张证书。
三个高频问题
证书不匹配:说明服务端返回的不是你预期的域名对应证书。先确认 -servername 有没有写对,再看服务端是不是按 SNI 分流。
链不完整:返回的开头只有一张叶子证书,接下来应该是中间证书。缺中间证书时,部分客户端会直接判定不可信。
协议版本过低:输出里能看到协商结果。现在应当只保留 TLSv1.2 和 TLSv1.3。
把验证结果变成可判定的
脚本里做健康检查时,比起肉眼扫输出,更可靠的是取这几个量:握手是否成功、verify 的返回码、证书的 notAfter、以及实际协商到的协议。返回码是程序能直接判断的,其余两个用来提前发现到期和不兼容。