2、常见故障类型:证书过期未轮换、轮换后服务不可用、中间证书链不完整、私钥不匹配

说实话,干运维这些年,我见过最多的证书事故,翻来覆去就是这四类。你把这四种搞明白了,至少能解决 90% 的线上证书问题。咱们一个一个来拆。

2.1 证书过期未轮换——最蠢也最常见的坑

这故障说白了就是:证书到期了,但没人去换。我遇到过不止一次,客户半夜打电话说「网站打不开了」,上去一看,证书过期三天了。

核心表现:

  • 浏览器提示「连接不安全」或 NET::ERR_CERT_DATE_INVALID
  • curl 请求返回 SSL certificate problem: certificate has expired
  • 服务端日志出现 x509: certificate has expired or is not yet valid

为什么会这样?原因其实就三个:

  1. 没人盯有效期——证书到期前没人通知,或者通知了没人处理。
  2. 监控缺失——没有对证书有效期做主动探测。
  3. 轮换流程没跑通——知道要换,但脚本挂了、权限不对、路径写死。

我的习惯:所有证书到期前 30 天、14 天、7 天、1 天各发一次告警。别信「我记着呢」,人脑靠不住。

2.2 轮换后服务不可用——换了还不如不换

这个更气人。明明证书换好了,服务反而挂了。我印象最深的一次,是给一个支付网关换证书,换完所有 HTTPS 请求都返回 502。查了半天,原来是新证书的密钥类型跟 Nginx 配置的 cipher 不兼容。

常见原因:

  • 新证书格式不对(PEM vs DER 混了)
  • 密钥长度或算法变了(比如从 RSA 2048 换到 ECDSA)
  • 证书文件权限不对(Nginx 读不了)
  • 服务没 reload 或 restart(只替换了文件没重载进程)

嗯,这里要注意:替换证书后一定要做「服务重载验证」。我个人的标准流程是:

# 1. 检查证书文件
openssl x509 -in /etc/ssl/certs/new.crt -text -noout

# 2. 检查私钥
openssl rsa -in /etc/ssl/private/new.key -check

# 3. 验证证书和私钥是否匹配
openssl x509 -noout -modulus -in new.crt | openssl md5
openssl rsa -noout -modulus -in new.key | openssl md5
# 两个 md5 必须一致

# 4. 重载服务并验证
nginx -t && systemctl reload nginx
curl -I https://yourdomain.com

2.3 中间证书链不完整——浏览器不认账

这个坑特别隐蔽。你服务器上的证书本身没过期,私钥也对,但某些客户端就是报错。为什么?因为你没把中间证书带上。

说白了,浏览器只信任它内置的根证书。你的服务器证书是中间 CA 签发的,浏览器不认识中间 CA,你得把中间证书链一起发给它。你不发,浏览器就断链。

典型报错:

  • Chrome: ERR_CERT_AUTHORITY_INVALID
  • curl: SSL certificate problem: unable to get local issuer certificate
  • Java 客户端: PKIX path building failed

我曾经帮一个电商平台排查过这个问题。他们用 Let's Encrypt 的证书,但只配了 server.crt,没配 fullchain.pem。结果 Chrome 能访问,但老版本的 Android 浏览器全挂了。你想想看,这损失有多大。

验证方法:

openssl s_client -connect yourdomain.com:443 -showcerts
# 看输出里是不是有多个证书(server + intermediates)
# 如果只有 1 个证书,说明链没配全

2.4 私钥不匹配——证书和密钥不是一家人

这个最简单,但也最容易犯。你生成了一对新证书,但忘了生成新私钥,或者把旧私钥跟新证书配在一起了。结果就是:证书里的公钥跟私钥对不上。

我见过最离谱的一次,是有人把两个不同域名的证书和私钥混在一起了。生产环境挂了两个小时,就因为他复制文件的时候搞混了。

快速判断:

# 对比证书和私钥的 modulus
openssl x509 -noout -modulus -in server.crt
openssl rsa -noout -modulus -in server.key
# 两个输出必须完全一样

嗯,这里我多说一句:永远不要手动复制证书文件。用脚本,用 CI/CD,用配置管理工具。人肉操作是故障的第一来源。

2.5 四种故障对比速查表

故障类型 根因 典型报错 排查优先级
证书过期未轮换 有效期管理缺失 certificate has expired ⭐⭐⭐⭐⭐
轮换后服务不可用 配置/格式/权限问题 502 / SSL_ERROR ⭐⭐⭐⭐
中间证书链不完整 缺少中间 CA 证书 unable to get local issuer ⭐⭐⭐
私钥不匹配 证书与私钥不对应 key values mismatch ⭐⭐⭐⭐

2.6 故障排查知识图谱

下面这张图,是我自己总结的排查路径。你按这个顺序走,基本不会漏。

证书故障排查知识图谱 收到证书告警 检查证书有效期 已过期 → 立即轮换 未过期 → 检查链完整性 中间证书链完整? 检查私钥匹配 补全中间证书链 验证 modulus 是否一致 💡 按此路径排查 不会遗漏任何环节

我的经验:遇到证书问题,先看有效期,再看链完整性,最后对私钥。这个顺序能帮你最快定位问题。别一上来就查配置,浪费时间。