openssl是唯一可靠、无需额外依赖的方案:本地用x509 -in cert.pem -noout -enddate查纯pem/crt证书过期时间,线上用s_client -connect host:443 -servername host | x509 -noout -enddate实时抓取握手证书,注意sni和证书段纯净性。

直接看本地证书文件或线上服务的实时证书,openssl 是唯一可靠、无需额外依赖的方案。别信浏览器锁图标或第三方网站——它们可能缓存旧证书,或根本看不到中间证书链问题。
用 openssl x509 查本地 PEM/CRT 文件的过期时间
这是最准的,前提是你手里的文件确实是纯证书(不是 key + cert 混在一起)。
-
openssl x509 -in /path/to/cert.pem -noout -enddate输出notAfter=...,就是过期时间 - 如果报错
unable to load certificate,大概率是文件里混了私钥或多个证书段;用awk '/^-----BEGIN CERTIFICATE-----/,/^-----END CERTIFICATE-----/' cert.pem抽出第一段再试 - 想同时看生效和过期:改用
-dates参数,输出两行notBefore和notAfter - 注意:.crt、.pem、.cer 都支持;但 .pfx/.p12 必须先转成 PEM:
openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem
用 openssl s_client 查线上服务真实证书
本地文件可能没更新,Nginx 配置也可能指向了错误路径。必须从 TCP 层真实握手一次,才能拿到服务端实际返回的证书链。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 基础命令:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate - 加
-servername是必须的,否则 SNI 不匹配,可能拿到默认证书甚至连接失败 - 如果服务只支持 TLSv1.3(比如某些 Cloudflare 配置),得加
-tls1_3,否则握手失败 -
ssl handshake failure多半是协议/ALPN 不兼容,不是证书本身问题;Connection refused是端口不通,先检查防火墙和监听状态
批量检查或自动预警时别踩 date 解析坑
不同系统对 Mar 15 12:34:56 2025 GMT 这类字符串的 date -d 解析行为不一致(CentOS vs Ubuntu),脚本一换环境就挂。
- 安全做法是让
openssl自己转时间戳:openssl x509 -in cert.pem -noout -checkend 2592000(检查是否 30 天内过期),返回 0 表示还安全 - 真要算剩余天数,用
awk提取notAfter后,交给date -d前先统一 locale:LC_ALL=C date -d "$enddate" +%s 2>/dev/null - 批量扫目录时,
find /etc/letsencrypt/live -name "fullchain.pem" -exec openssl x509 -noout -enddate -in {} \;,别漏掉-noout,否则输出一堆 Base64 干扰解析
真正容易被忽略的是中间证书:s_client 默认只返回 leaf cert,但有些服务会发完整链;如果没加 -showcerts,你看到的可能是中间 CA 的过期时间而非站点证书本身——查之前先确认你盯的是哪一层。










