s_client 是什么
openssl s_client 手工发起一次 TLS 握手并把协商结果打印出来:协议版本、加密套件、对端证书链与验证结论。它是回答「证书装对没有、链全不全、什么时候到期、还在不在支持弱协议」最直接的工具。多域名站点必须带 -servername 指定 SNI,否则服务器可能返回默认证书,核对的对象根本不是目标域名。把输出交给 openssl x509 解析,还能把证书主体、签发者与到期时间变成可脚本判断的内容。
基本信息
| 适用平台 | Linux/macOS(OpenSSL 命令行工具);Windows 可用 Git 自带版本或 WSL |
|---|---|
| 命令语法 | openssl s_client -connect 主机:端口 [-servername 域名] [-showcerts|-brief] |
| 常用选项 | -connect 目标 -servername 指定 SNI -showcerts 输出完整链 -brief 输出摘要 -verify 显示验证码 -tls1_2 指定协议版本 |
| 配套命令 | openssl x509 解析证书、-checkend 判断到期、-noout 抑制编码输出 |
| 权限说明 | 普通用户即可,只需能访问目标端口 |
典型使用场景
- 上线核对:确认新部署的证书是目标域名、签发者与预期一致
- 链完整性检查:漏装中间证书时浏览器报错,命令行能直接看到验证失败
- 协议合规:确认是否还在协商 TLS 1.0/1.1 或弱加密套件
- 到期监控:用 -checkend 判断证书是否在指定时间内到期,便于脚本告警
- 故障定界:HTTP 能通但 HTTPS 失败时,区分是证书问题还是后端服务问题
常用示例
常用示例
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -checkend 2592000 # 30 天内将到期则返回非 0
echo | openssl s_client -connect 10.0.0.5:443 -servername app.internal 2>&1 | grep -E 'Verify|Protocol|Cipher'
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null | head -n 40
echo | openssl s_client -connect example.com:443 -servername example.com -brief 2>&1 | head -n 12握手输出关键行
| 输出行 | 含义 | 怎么看 |
|---|---|---|
| Verify return code | 证书链验证结论 | 0 表示验证通过,非 0 通常是缺中间证书或根不受信 |
| Protocol | 协商到的 TLS 版本 | 与合规基线比对,是否仍允许旧版本 |
| Cipher | 协商使用的加密套件 | 检查是否落入弱套件清单 |
| subject 与 issuer | 证书主体与签发者 | 确认域名与 CA 是否符合预期 |
s_client 在握手完成后会保持连接等待标准输入。命令里加 echo | 或 </dev/null 让它立刻结束,否则终端会一直停在连接状态。
不带 -servername 时服务器返回的是默认证书。多域名或默认站点与目标站点分离的环境,漏了这个参数会验证到完全不同的证书,得出错误结论。