证书到期为什么总是事故
TLS 证书带明确到期时间,客户端校验链路时发现过期会直接中断连接:浏览器提示不安全,App 报网络异常。近年公网证书有效期被持续压缩(主流 CA 多为 90~398 天),内网自签证书却动辄三五年,两类都必须进台账,靠人脑记到期日已经不可行。
基本信息
| 适用平台 | Linux/macOS/WSL(OpenSSL 1.1.1+) |
|---|---|
| 检查对象 | 公网 HTTPS、内网服务、负载均衡与网关证书 |
| 判读阈值 | 剩余<30 天进续期清单,<7 天按紧急处理 |
| 建议频率 | 每周巡检一次,变更后立即复检 |
典型使用场景
- 到期前的批量盘点:一次拉出全部站点剩余天数,排出续期顺序
- 证书轮换后的验收:确认新证书已下发、旧证书已摘除、证书链完整
- 排查部分用户报证书错误:判断是 SNI 拿错证书还是中间链缺失
- 非网站场景巡检:负载均衡、K8s Ingress、数据库与消息中间件的监听证书
- 审计留档:按域名、颁发者、到期日、剩余天数、自动续期状态成表
核查命令
核查命令
# 探公网站点证书,-servername 指定 SNI,避免取到默认虚拟主机证书
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates
# 直接算剩余天数,便于批量出报告
end=$(echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
echo $(( ( $(date -d "$end" +%s) - $(date +%s) ) / 86400 ))
# 本地证书文件:Let's Encrypt 与系统证书库
find /etc/letsencrypt/live -name fullchain.pem 2>/dev/null | head
for f in /etc/pki/tls/certs/*.pem; do echo "$f"; openssl x509 -noout -enddate -in "$f" 2>/dev/null; done | head -20输出逐列读法
| 字段 | 含义 | 异常表现 |
|---|---|---|
| subject | 证书主体(CN 与 SAN 域名) | 与目标域名不符,说明拿到默认站点或 SNI 未生效 |
| issuer | 签发者 | 自签或未知 CA,客户端链校验必失败 |
| notBefore | 生效时间 | 晚于当前时间,说明机器时钟错乱或证书提前签发 |
| notAfter | 到期时间 | 剩余不足 30 天要排期,已过期则连接直接中断 |
| 剩余天数 | 自算字段 | 出现负数即已过期,出现小数说明分母用了秒差 |
自动续期自检
自动续期自检
certbot renew --dry-run # 演练续期,不真正签发
systemctl list-timers | grep -i certbot # 确认续期定时器仍在跑
nginx -t && systemctl reload nginx # 续期后重载才加载新证书报告固定五列最省事:域名、颁发者、到期日、剩余天数、是否已开自动续期。数值口径先在团队内对齐,避免同一批站点两个人算出不同剩余天数。
自动续期只解决签发,不解决加载:证书更新后服务未重新读取,客户端拿到的仍是旧证书,报错照旧。续期后必须比对服务实际下发的指纹。
内网自签与公网证书分开盘点:两者到期时间、责任人与续期方式完全不同,混在一张表里最容易漏整改。