命令行如何验证 SSL 证书的有效性
用 OpenSSL 验证证书链,并显式检查服务器用途与主机名;信任库按安装环境配置。介绍 -untrusted、-CAfile 及远程 s_client 验证,避免把连接成功当成证书有效。
三种典型场景
1. 单张证书 + 系统根证书库
openssl verify cert.pem
# cert.pem: OK
2. 证书 + 中间证书链(最常见)
CA 通常给你站点证书和 chain/bundle 两个文件:
openssl verify -untrusted ca-chain.pem cert.pem
-untrusted 告诉 openssl"这些中间证书用于补链,但不当信任锚"。
3. 自建 CA 环境(内网/测试)
openssl verify -CAfile my-root-ca.pem cert.pem
openssl verify -CApath /etc/ssl/certs cert.pem # 指定根证书目录
验证远程站点的完整链
openssl s_client -connect example.com:443 -servername example.com \
-verify_hostname example.com -verify_return_error </dev/null
# 同时检查证书链、主机名和命令退出状态;不要隐藏错误输出
-servername 只发送 SNI,不负责主机名验证;-verify_hostname 才验证域名。-verify_return_error 让验证失败终止握手。吊销检查需要另外配置 CRL/OCSP,默认成功不证明未吊销。
单次验证通过后,定期检查同一域名的到期时间。观测云 SSL 拨测 可设置 Host、端口、证书剩余天数条件与执行节点,先运行测试获取证书信息,再按续期安排设置周期和通知。它检查的是该节点看到的证书,客户端信任库差异仍按上面的命令单独排查。
失败原因码速查
| 代码 | 含义 | 处理 |
|---|---|---|
| 10 | 证书已过期 | 续期重签 |
| 18 | 自签名证书不在信任库 | 内网 CA 加进信任库或 -CAfile |
| 21 | 无法验证第一张证书(链不完整) | 补中间证书 |
| 2 | 找不到签发者证书 | 根证书库缺失/路径不对 |
常见问题(FAQ)
A:浏览器、操作系统和 OpenSSL 的信任库及补链行为可能不同。OpenSSL 默认路径取决于编译和安装方式;应使用目标客户端所需的信任策略排查,而非一律以某个工具为准。
Q:怎么验证 pfx/p12 格式证书?
A:先转 PEM:openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem,另行提取所需中间证书再按上文验证;验证证书不需要导出私钥。
参考资料
本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。
- docs.openssl.org:openssl s client
- docs.guance.com:http
- docs.guance.com:ssl
- docs.guance.com:synthetic test detection