错误编号就是索引
openssl verify 失败时会输出 X509_V_ERR 编号与英文描述,编号本身就是排错索引:9 与 10 是时间问题,18 到 21 是信任链问题,23 是吊销,62 是域名不匹配。配合输出里的 depth 信息,可以直接判断断在链的哪一层,比在浏览器里逐项试错高效得多。
编号速查
| 9 / 10 | certificate is not yet valid / certificate has expired |
|---|---|
| 18 / 19 | self-signed certificate / self-signed certificate in certificate chain |
| 20 / 21 | unable to get local issuer certificate / unable to verify the first certificate |
| 23 | certificate revoked,需配合 -crl_check |
| 24 / 26 | invalid CA certificate / unsupported certificate purpose |
| 62 | hostname mismatch |
排查动作清单
- 记录完整的编号与 depth,再对照速查表确定问题大类
- 检查是否漏传 -untrusted,链不完整是最常见的误判来源
- 核对系统时间与时区,排除 9 与 10 号时间类错误
- 确认信任根与目标体系匹配,内部 CA 签发的证书不要用公网根验证
- 把编号与复现命令一并记录进问题单,便于后续复查与自动化
典型使用场景
- 排查链验证失败:先看编号定位大类,再看描述确认细节
- 校验证书用途:用 -purpose 触发 26 号错误来确认用途扩展问题
- 复核自签体系:确认链中是否混入了自签证书
- 提交问题单:把编号与 depth 一起贴出,沟通成本最低
- 自动化门禁:脚本解析编号做分支处理与告警分级
输出解读
输出解读
# 信任根用 -CAfile,中间链用 -untrusted
openssl verify -CAfile ca.pem -untrusted chain.pem leaf.pem
# 典型输出
# leaf.pem: CN = example.com
# error 20 at 0 depth lookup: unable to get local issuer certificate
# 配合 -show_chain 打印各层,直接看出断在哪一级
openssl verify -show_chain -CAfile ca.pem -untrusted chain.pem leaf.pem按编号定位
| 编号段 | 问题大类 | 下一步 |
|---|---|---|
| 9 与 10 | 时间不匹配 | 核对 notBefore / notAfter 与系统时钟 |
| 18 至 21 | 信任链断 | 补中间证书,确认信任锚正确 |
| 23 | 证书被吊销 | 查看 CA 吊销信息并尽快换证 |
| 24 与 26 | CA 资格或用途不符 | 检查 basicConstraints 与 EKU |
| 62 | 域名不匹配 | 核对 SAN 与访问名称 |
配合 -show_chain 可以打印各层证书,快速看出链在哪一级断开。
error 20 出现在 depth 0 表示叶证书的签发者没找到;出现在更深的层级说明中间链本身不完整,两种情况的处置方式并不相同。
不要为了让校验通过而把不相关的 CA 塞进 -CAfile:看似解决了问题,实际掩盖了链的真实缺陷,后续会更难定位。