首页/安全/加密与证书速查/openssl verify 错误码对照

openssl verify 错误码对照

openssl verify 的 X509_V_ERR 编号是排错依据:9/10 是时间问题、18/19/20 是信任链问题、23 是吊销、62 是域名不匹配;结合 depth 提示可以确定断在链的哪一层。

加密与证书速查安全更新于 2026-10-13

错误编号就是索引

openssl verify 失败时会输出 X509_V_ERR 编号与英文描述,编号本身就是排错索引:9 与 10 是时间问题,18 到 21 是信任链问题,23 是吊销,62 是域名不匹配。配合输出里的 depth 信息,可以直接判断断在链的哪一层,比在浏览器里逐项试错高效得多。

编号速查

9 / 10certificate is not yet valid / certificate has expired
18 / 19self-signed certificate / self-signed certificate in certificate chain
20 / 21unable to get local issuer certificate / unable to verify the first certificate
23certificate revoked,需配合 -crl_check
24 / 26invalid CA certificate / unsupported certificate purpose
62hostname 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 与 26CA 资格或用途不符检查 basicConstraints 与 EKU
62域名不匹配核对 SAN 与访问名称
配合 -show_chain 可以打印各层证书,快速看出链在哪一级断开。
error 20 出现在 depth 0 表示叶证书的签发者没找到;出现在更深的层级说明中间链本身不完整,两种情况的处置方式并不相同。
不要为了让校验通过而把不相关的 CA 塞进 -CAfile:看似解决了问题,实际掩盖了链的真实缺陷,后续会更难定位。

易错点

  • 只看 error 编号不看英文描述与 depth 信息
  • 手工把无关 CA 塞进 -CAfile 让校验通过,掩盖真实问题
  • 忽略 -untrusted,把链不完整误判为根信任问题
  • 用 verify 的通过结果代替浏览器行为判断,忽略吊销与域名匹配
  • 输出中的 CN 与实际访问域名不同却未意识到配置指向了别的证书

数据来源与参考

  • OpenSSL 官方文档(verify 错误码列表)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌