openssl 证书核查是什么
不安装额外工具,用 openssl s_client 就能从线上读取证书的主题、签发者、有效期与 SAN 扩展,再配合 x509 解析输出,可以做证书到期预警与部署差错排查。这项检查有两个容易出错的细节:一是必须显式指定 SNI,否则多域名共用 IP 时会取到默认站点的证书;二是要关注链完整性,自签名或中间证书缺失的站点在部分客户端上会直接报错。
基本信息
| 适用平台 | Linux、macOS(Windows 可用 WSL 或 Git Bash) |
|---|---|
| 关键参数 | -connect 目标、-servername 指定 SNI、-showcerts 输出完整链 |
| 解析工具 | openssl x509 -noout 配合 -subject / -issuer / -dates / -ext |
| 常见用途 | 到期预警、链完整性核查、部署变更后确认生效 |
典型使用场景
- 证书更换后确认线上已生效,而不是只确认了文件已上传
- 批量核查多个域名的剩余有效期,生成到期预警清单
- 排查某客户端报证书错误:确认链是否完整、SNI 是否正确
- 核对证书 SAN 列表,确认新增子域已被覆盖
- 监控脚本中作为证书到期告警的数据来源
证书信息读取
证书信息读取
# 读取线上证书的主题、签发者、有效期与 SAN
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -ext subjectAltName
# 查看完整证书链(判断中间证书是否缺失)
echo | openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null | head -40
# 检查验证结果与错误
echo | openssl s_client -connect example.com:443 -servername example.com 2>&1 \
| grep -E 'Verify return code|verify error'到期检查脚本片段
到期检查脚本片段
END=$(echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -enddate | cut -d= -f2)
# 转为时间戳,与当前时间比较得出剩余天数
date -d "$END" +%s # GNU date
# macOS 用:date -j -f '%b %d %T %Y %Z' "$END" +%s
# 剩余天数低于阈值即告警输出字段读法
| 字段 | 含义 | 异常表现 |
|---|---|---|
| subject | 证书主题(CN) | 与访问域名不一致 |
| issuer | 签发机构 | 与预期 CA 不符需复核 |
| notAfter | 到期时间 | 剩余天数低于预警阈值 |
| subjectAltName | 覆盖的域名列表 | 缺少实际使用的域名 |
| Verify return code | 链验证结果 | 非 0 表示链或信任问题 |
SNI 必须显式指定:多域名共用同一 IP 时,不指定会取到默认站点的证书,据此得出的结论可能是另一个域名的。
证书检查只反映握手层面的情况:证书正确不代表服务正常,变更后还应做一次业务请求验证。