首页/安全/加密与证书速查/s_client 校验行为与退出码

s_client 校验行为与退出码

openssl s_client 默认在证书校验失败时仍打印握手信息并正常退出,容易造成能连上就没问题的误判;加 -verify_return_error 可让校验失败直接中止,便于脚本判断。

加密与证书速查安全更新于 2026-10-13

校验行为与退出码

命令行握手工具默认在证书校验失败时仍打印握手信息并正常退出,这容易造成「能连上就没问题」的误判。加上让校验失败直接中止的选项后,脚本才能通过退出码判断结果;同时还要核对输出中的校验返回码。做巡检时还应指定目标名称,否则可能拿到默认站点的证书而得出错误结论。

基本信息

默认行为打印校验返回码但不中止连接
严格模式校验失败即返回错误,便于脚本判断
脚本建议指定根证书文件并检查退出码,同时核对返回码
巡检注意必须指定目标名称,否则可能命中默认站点

典型使用场景

  • 巡检脚本:需要根据退出码判断证书是否有效
  • 排错:确认证书链是否真的校验通过
  • 多站点批量检测:统一输出格式
  • 发布后验证:确认新证书已被正确加载
  • 兼容性验证:确认客户端能否校验服务端证书

严格校验与脚本用法

严格校验与脚本用法
openssl s_client -connect example.com:443 -servername example.com -verify_return_error </dev/null
echo $?                                                                   # 校验失败时返回非零
openssl s_client -connect example.com:443 -servername example.com -brief </dev/null

返回码含义

返回码含义处理
0校验通过正常
10证书已过期更换证书
20无法获取本地签发者补齐链或根证书
62名称不匹配核对名称与虚拟主机配置
返回码与常用校验工具的错误编号一致,掌握几个高频编号可以快速定位方向;只看到「握手成功」并不代表校验通过。

落地建议

  • 巡检脚本同时检查退出码与返回码
  • 指定目标名称与根证书文件
  • 批量检测时保留原始输出便于复核
  • 把巡检结果接入告警,而不是只打印到终端
用未指定目标名称的探测结果判断线上证书状态,会命中默认站点的证书;这类错误结论会让排查方向完全偏离实际服务。

易错点

  • 脚本只看命令是否执行成功,忽略校验返回码
  • 巡检漏掉指定目标名称,拿到默认站点证书造成误判
  • 把「能建立连接」当成「证书有效」,忽略了默认不中止的行为
  • 没有指定根证书文件,换环境后结论不一致
  • 批量检测不保留原始输出,出现异常时无法复核
  • 只校验叶证书而不验证整条链的完整性

数据来源与参考

  • OpenSSL 官方文档(s_client 选项)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌