网站证书快过期了别等用户报错:用 openssl s_client 三步看清有效期并设好到期提醒
网站能正常打开,不代表证书没问题。很多站点都是在用户浏览器弹出“证书已过期”之后才发现问题:证书到期前没有任何告警,运维也没有定期检查的习惯。本文用三步把证书有效期的检查变成一件 5 分钟能做完的事,并留一个到期提醒的办法。
第一步:用 openssl s_client 看证书还剩多少天
在云服务器上执行下面这条命令,把 www.example.com 换成自己的域名,443 换成实际端口:
openssl s_client -connect www.example.com:443 -servername www.example.com </dev/null 2>/dev/null | openssl x509 -noout -dates -subject -issuer
输出里最关键的是两个时间:
notBefore:证书生效时间;notAfter:证书过期时间。
再算一下剩余天数:
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null | openssl x509 -noout -enddate
得到 notAfter 后和今天对比即可。建议把“剩余天数小于 30 天”当作必须处理的红线,而不是等到最后一天。
注意:不加
-servername时,服务器可能返回默认证书而不是该域名的证书,查出来的有效期就是错的。多域名、CDN 回源的场景尤其要带上 SNI。
第二步:顺带核对证书链是否完整
只看过期时间还不够,证书链缺中间证书时,部分浏览器和客户端也会报错。用同一条连接命令查看返回的证书链条数:
openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts </dev/null 2>/dev/null | grep -c "BEGIN CERTIFICATE"
一般应返回 2 张或更多证书(站点证书 + 中间证书)。如果只有 1 张,说明服务器只下发了站点证书,需要把中间证书补进 Nginx 或负载均衡的证书配置里,常见做法是把站点证书和中间证书按顺序合并成一个文件后重新加载配置,再用 nginx -t 检查语法、平滑重载。
同时顺手核对 subject 里的域名与实际访问域名是否一致:证书是给 www.example.com 签的,却用 api.example.com 访问,浏览器同样会拦截。
第三步:把检查写成定时任务,提前 14 天提醒
人记不住,脚本记得住。把检查写成一个小脚本,每天跑一次,剩余天数小于 14 天就发告警:
#!/bin/bash
# check_cert.sh
DOMAIN="www.example.com"
EXPIRE=$(echo | openssl s_client -connect ${DOMAIN}:443 -servername ${DOMAIN} 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRE_TS=$(date -d "$EXPIRE" +%s)
NOW_TS=$(date +%s)
LEFT=$(( (EXPIRE_TS - NOW_TS) / 86400 ))
echo "${DOMAIN} 证书剩余 ${LEFT} 天,到期时间:${EXPIRE}"
if [ "$LEFT" -lt 14 ]; then
echo "告警:${DOMAIN} 证书 ${LEFT} 天后过期,请尽快续期!"
fi
把脚本放进每日定时任务,或接入已有的监控告警通道(如企业微信、短信、邮件),让“证书要过期了”变成一条提前 14 天到达的消息,而不是用户先发现的故障。
排障速查表
| 现象 | 先查什么 |
|---|---|
| 浏览器提示证书已过期 | openssl x509 -noout -dates 看 notAfter |
| 提示证书域名不匹配 | subject 里的 CN/SAN 与访问域名是否一致 |
| 部分客户端报证书链不信任 | -showcerts 返回的证书张数,是否缺中间证书 |
| 查出来的证书不是自己的 | 是否漏了 -servername,或负载均衡上挂错了证书 |
| 刚续期仍提示过期 | 配置是否重载、CDN 节点缓存是否已刷新 |
小结
证书到期不是技术难题,是管理问题:查一次 5 分钟,设好提醒后几乎零成本。建议今天就做三件事:查清主力域名的剩余天数,核对一次证书链,把剩余天数小于 30 天的域名列进续期清单并设好 14 天提醒。等用户先报障再处理,成本要高得多。
- 点赞
- 收藏
- 关注作者
评论(0)