证书过期为什么突然爆发
证书都有明确的有效期,到期瞬间所有依赖它的客户端同时报错,属于典型的定时炸弹式故障。浏览器与调用方给出的提示各不相同:有的说过期,有的说不受信任,有的只说握手失败。用命令行工具直接读取服务端证书的有效期与颁发链,比猜测报错含义更可靠。
换证书之前的两个检查
一是核对系统时间,时间漂移会让未过期的证书被判定为过期,这类情况下换证书并不能解决问题。二是核对证书链是否完整,只替换叶子证书而漏掉中间证书,浏览器与客户端仍然认为不受信任。两项确认之后再做替换与重载。
基本信息
| 检查工具 | openssl 客户端命令、curl 详细输出 |
|---|---|
| 关注信息 | 生效与失效时间、主体、颁发者、校验返回码 |
| 服务侧改动 | 更新证书文件后先校验配置再平滑重载 |
| 常见遗漏 | 中间证书缺失、客户端信任库未同步 |
典型使用场景
- 浏览器或接口调用方集中报证书过期
- 自签证书更换后内网客户端仍提示不受信任
- 负载均衡与应用服务器两侧证书不一致造成轮询报错
- 巡检时核对证书剩余有效期,提前安排续期
- 排查 HTTPS 握手失败,确认是证书问题还是协议配置问题
检查
检查
openssl s_client -connect app.example.com:443 -servername app.example.com </dev/null 2>/dev/null | openssl x509 -noout -dates -subject -issuer
curl -vI https://app.example.com 2>&1 | grep -iE 'expire|certificate|SSL' | head
date # 系统时间是否漂移
openssl s_client -connect app.example.com:443 -showcerts </dev/null 2>/dev/null | grep -c 'BEGIN CERTIFICATE' # 链上证书数量替换与验证
替换与验证
# 更新证书与私钥文件后(以 nginx 为例):
nginx -t && systemctl reload nginx # 先校验配置再平滑重载
openssl s_client -connect app.example.com:443 </dev/null 2>/dev/null | grep -E 'Verify return code|depth'
curl -sI https://app.example.com | head -3 # 复核访问正常
# 多节点部署时逐台更新,避免节点间证书版本不一致报错与含义
| 报错或现象 | 含义 | 处理方向 |
|---|---|---|
| certificate has expired | 证书已过期 | 更新证书并重载服务 |
| unable to verify the first certificate | 信任链不完整 | 补上中间证书 |
| self signed certificate | 自签证书不在信任库 | 分发根证书或改用受信证书 |
| 证书未过期却报过期 | 客户端系统时间不正确 | 先核对并校正时间 |
| 仅在部分客户端报错 | 对端信任库差异 | 更新对应客户端的信任库 |
把证书剩余有效期纳入巡检或监控告警,在到期前留出足够的更换与验证时间;自签证书场景要同步维护客户端的信任库清单,否则每次更换都要重新分发。