必须用 openssl 连接远程服务器获取真实证书到期时间,加 -servername 参数避免 sni 环境错误;用 -checkend 检查剩余有效期,返回 0 表示有效;提取完整证书链需用 -showcerts 并保持顺序。

要确认线上服务是否会在近期因SSL证书过期而中断访问,必须准确获取远程服务器当前实际使用的证书到期时间,不能依赖本地文件或缓存信息。
用 OpenSSL 连接并解析远程证书
这一步直接与目标服务器完成 TLS 握手,拿到真实生效的证书链,是唯一能反映生产环境状态的方法。
执行命令:echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
其中 【-servername example.com 必须加上】,否则在使用 SNI 的多域名虚拟主机(如 Nginx、CDN、WAF)环境下,可能返回默认证书或握手失败;不加该参数时,部分 CDN(如 Cloudflare)会拒绝连接或返回错误证书。
如果提示 ssl handshake failure,说明目标禁用了旧协议,改用:echo | openssl s_client -connect example.com:443 -servername example.com -tls1_2 2>/dev/null | openssl x509 -noout -dates
快速判断是否即将过期(运维推荐)
人工计算剩余天数易出错,且证书时间基于 UTC,系统时区或时间偏差会导致误判。OpenSSL 提供了原子级验证指令:
运行:echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -checkend 86400
返回值为 0 表示证书在未来 24 小时内仍有效;非 0 表示已过期或将在 24 小时内过期。这是脚本自动告警的可靠依据。
若需检查 7 天内是否过期,把 86400 换成 604800 即可。
提取完整证书链用于离线分析
当需要查看中间证书、验证证书链完整性,或向 CA 提交问题排查时,必须保存整条链。
第一步:获取并保存证书链
执行:echo | openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' > cert_chain.pem
第二步:分离叶证书(即网站证书)
用文本编辑器打开 cert_chain.pem,复制第一段(从 -----BEGIN CERTIFICATE----- 到第一个 -----END CERTIFICATE-----)另存为 site.crt
第三步:查看叶证书有效期
执行:openssl x509 -in site.crt -noout -dates
注意:证书链顺序必须是叶证书→中间证书→根证书,否则后续验证会失败;【不要手动调整顺序或删减中间证书】,否则 openssl verify 会报 unable to get local issuer certificate。











