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
为什么会这样?原因其实就三个:
- 没人盯有效期——证书到期前没人通知,或者通知了没人处理。
- 监控缺失——没有对证书有效期做主动探测。
- 轮换流程没跑通——知道要换,但脚本挂了、权限不对、路径写死。
我的习惯:所有证书到期前 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 故障排查知识图谱
下面这张图,是我自己总结的排查路径。你按这个顺序走,基本不会漏。
我的经验:遇到证书问题,先看有效期,再看链完整性,最后对私钥。这个顺序能帮你最快定位问题。别一上来就查配置,浪费时间。