s_client 检查清单
openssl s_client 是排查 TLS 最顺手的命令行工具:可以指定协议版本、发送 SNI、打印服务端下发的完整证书链、执行校验并请求 OCSP 状态。它回答的是「实际协商结果是什么」,因此比翻配置文件更可信,适合上线前验证与故障定位。
基本信息
| 所属工具 | OpenSSL 命令行套件 |
|---|---|
| 核心用途 | 按指定条件发起 TLS 连接并打印握手与证书细节 |
| 常用参数 | -connect、-servername、-showcerts、-verify_return_error、-status、-tls1_2/-tls1_3 |
| 关键输出 | Protocol、Cipher、Verify return code、证书链与有效期 |
| 退出码 | 默认校验失败也可能返回 0,需加 -verify_return_error |
| 配合命令 | 管道给 openssl x509 解析证书字段 |
典型使用场景
- 上线验证:确认服务端实际协商的协议版本与套件符合基线
- 证书链排查:用 -showcerts 看服务端究竟下发了哪几张证书、顺序如何
- 多站点排查:指定 SNI 确认虚拟主机选择了正确证书
- 兼容性测试:分别用 -tls1_2 与 -tls1_3 测试不同客户端的协商路径
- 到期巡检:抓取线上证书后交给 x509 检查有效期与扩展
常用组合
常用组合
# 完整握手信息 + 完整证书链(多站点必须带 -servername)
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null
# 严格校验:校验失败直接以非 0 退出码结束,便于脚本判断
openssl s_client -connect example.com:443 -servername example.com -verify_return_error </dev/null
# 限定版本测试,确认实际协商到的协议
openssl s_client -connect example.com:443 -tls1_2 </dev/null 2>&1 | grep -E 'Protocol|Cipher'
# 请求 OCSP 装订响应,观察是否启用
openssl s_client -connect example.com:443 -servername example.com -status </dev/null 2>&1 | grep -A3 'OCSP'
# 只取证书字段用于巡检
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates输出关键项读法
| 输出项 | 含义 | 正常与异常 |
|---|---|---|
| Protocol | 实际协商到的协议版本 | 应为 TLSv1.2 或 TLSv1.3;出现 1.0/1.1 说明配置未收紧 |
| Cipher | 协商到的套件 | 应含 GCM/CHACHA20 与 ECDHE;出现 CBC 或静态 RSA 需整改 |
| Verify return code | 证书校验结果,0 表示通过 | 20 表示链不完整,62 表示域名不匹配,10 表示过期 |
| subject / issuer | 叶证书主体与签发者 | subject 应与访问域名匹配 |
| Server Temp Key | 临时密钥交换信息 | TLS 1.2 下出现说明具备前向保密 |
| BEGIN CERTIFICATE 数量 | 服务端下发的证书张数 | 通常为 2 张(叶 + 中间),只有 1 张多半链不完整 |
不带 -servername 测试多站点服务器会拿到默认站点证书,结论完全不可信;校验失败时退出码仍可能是 0,脚本里必须显式加 -verify_return_error 或解析输出内容,否则会把失败当成通过。
末尾的 Verify return code 与 Protocol、Cipher 是最常看的三项:0 表示证书链校验通过,非 0 时按错误码归类(链、域名、有效期)再排查。用 -verify_hostname 或 x509 的 -checkhost 可以单独验证域名匹配。