最直接查看证书内容需用 openssl x509 -in server.crt -text -noout;仅查有效期用 -dates,仅查域名用 -ext subjectAltName;远程证书须用 openssl s_client -showcerts 获取并解析;-checkend 是唯一可靠过期检查方式;证书链顺序必须为叶证书→中间证书→根证书,否则验证失败。

用 openssl x509 看证书内容最直接
证书文件(比如 server.crt)本身是 PEM 格式文本,但人眼没法直接读出有效期、域名、签发者这些关键信息。必须用 openssl x509 解析,否则看到的只是一堆 Base64 块。
常见错误是直接 cat server.crt 或用 openssl s_client 连远程服务却忘了加 -showcerts,结果什么也没输出或只拿到第一个证书。
- 查看本地证书:
openssl x509 -in server.crt -text -noout - 只看有效期:
openssl x509 -in server.crt -dates -noout - 只看域名(Subject Alternative Name):
openssl x509 -in server.crt -ext subjectAltName -noout(OpenSSL 1.1.1+ 才支持-ext) - 如果报错
unable to load certificate,大概率是文件里混了多余空行、Windows 换行符,或实际是 PKCS#12(.pfx)格式——得先用openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem提取
查远程网站的证书不能只靠 curl
curl -v https://example.com 会显示 TLS 握手过程,但默认不打印证书详情;它只告诉你“verified”或“unable to get local issuer certificate”,对排错帮助有限。
真正要拿到证书链做分析,得用 openssl s_client,它才是和 OpenSSL 库直连的调试工具。
- 获取并立刻解析:
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -text -noout - 想保存整条证书链(包括中间 CA):
echo | openssl s_client -connect example.com:443 -showcerts 2>/dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' > chain.pem - 注意:某些 CDN(如 Cloudflare)或 WAF 会拦截未带 SNI 的请求,此时要加
-servername example.com参数,否则可能拿到默认证书或连接失败 - 如果提示
ssl handshake failure,可能是目标禁用了旧协议(如 TLS 1.0),可试加-tls1_2强制指定版本
openssl x509 -checkend 判断是否快过期
运维最常做的不是“看证书”,而是“证明确实没过期”。人工算天数容易错,-checkend 是唯一靠谱的检查方式。
它返回 0 表示在指定秒数内有效,非 0 表示已过期或即将过期。别信自己心算的“还有 2 天”——时区、系统时间不准、证书用的是 UTC 都会影响判断。
- 检查未来 24 小时内是否过期:
openssl x509 -in cert.crt -checkend 86400 -noout(返回 0 = 安全) - 检查是否已经过期:
openssl x509 -in cert.crt -checkend 0 -noout(返回 0 = 还有效) - 脚本里用这个值做条件判断最稳,比如:
if ! openssl x509 -in cert.crt -checkend 0 -noout; then echo "EXPIRED"; fi - 注意:该命令不校验证书签名或信任链,只管时间。即使 CA 已吊销,只要没过期,它也返回 0
证书链顺序错了会导致验证失败
很多用户把多个证书拼进一个文件就以为完事了,结果 Nginx 启动报 SSL_CTX_use_certificate_chain_file failed,或者浏览器提示“证书不受信任”。问题往往不在证书本身,而在顺序。
PEM 文件里必须严格按:叶证书 → 中间证书 → (可选)根证书。OpenSSL 不会自动排序,也不会跳过无效块。多一个空行、少一个 -----END CERTIFICATE----- 都会让整个链失效。
- 检查顺序是否合法:
openssl crl2pkcs7 -nocrl -certfile bundle.pem | openssl pkcs7 -print_certs -noout—— 能正常输出说明格式和顺序基本没问题 - 快速提取叶证书(第一个):
awk '/BEGIN CERTIFICATE/{i++} i==1' bundle.pem > leaf.crt - 用
openssl verify -CAfile ca-bundle.crt cert.crt验证信任链时,-CAfile只接受根+中间,不能包含叶证书;而 Nginx 的ssl_certificate必须包含叶+中间,两者职责不同,别混用同一文件 - Let’s Encrypt 的
fullchain.pem是正确顺序,cert.pem只有叶证书——别图省事只丢cert.pem给 Web 服务器
证书时间戳、SNI、链顺序、验证上下文——这四个点任何一个出偏差,openssl 就会给你一个看似正常实则失效的结果。手动操作时,宁可多跑一条命令确认,也别依赖“应该没问题”。










