首页/安全/加密与证书速查/curl 证书校验失败排查

curl 证书校验失败排查

curl 校验失败时先读退出码与 -v 输出中的 subject/issuer,再判断属于链、域名还是信任库问题;-k 仅用于临时定位,不应留在脚本或配置里。

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

curl 校验失败怎么查

curl 的证书校验失败会给出明确的退出码,配合 -v 输出可以完整还原握手过程。排查顺序是:先看退出码判断大类,再从输出里读 subject 与 issuer 确认拿到的到底是哪张证书,最后判断问题出在信任链、域名还是本地信任库。需要强调:-k 只适合临时定位,绝不能留在脚本或配置里。

退出码对照

60unable to get local issuer certificate,本地信任库不含签发者
51证书无法用已知 CA 验证
35SSL connect error,握手失败
77CA 证书文件读取失败
83issuer check failed,依赖的 issuer 检查失败

典型使用场景

  • 排查接口调用失败:先确认是证书问题还是网络与端口问题
  • 访问内网服务:用 --cacert 指定企业内部根证书完成校验
  • 升级证书后回归:确认调用恢复正常,退出码归零
  • 发现中间人迹象:issuer 与预期不符时立即上报核查
  • 容器环境排查:确认镜像内的 CA 证书包是否完整

定位命令

定位命令
# 读取握手细节:subject 与 issuer 能直接指出是哪张证书在生效
curl -v https://example.com/ 2>&1 | grep -i 'subject\|issuer\|expire\|SSL certificate problem'
# 指定企业根证书完成验证
curl --cacert /etc/ssl/certs/corp-root.pem https://internal.example.com/
# 脚本里用退出码分支处理
curl -sS -o /dev/null https://example.com/; echo $?

退出码与处置

退出码含义处置
60本地信任库不含签发者补充根证书或使用 --cacert
51证书无法用已知 CA 验证检查服务端下发的链是否完整
35握手失败核对协议版本、端口与套件
77CA 文件读取失败检查路径与读取权限
83issuer 检查失败核对预期签发者与实际值
排查结束后必须恢复校验;长期使用 -k 会掩盖中间人风险,而且这类风险很难从日志中被发现。
容器与精简镜像是高频盲区:基础镜像里未必装有完整的 CA 包,更新 CA 后也需要重新加载;典型现象是同一域名在宿主机正常、在容器内报 60。
企业代理会替换根证书:issuer 显示为内部根而不是公开 CA 时,说明流量经过代理解密,这本身是预期行为,但必须确认代理证书的来源可信。

易错点

  • 用 -k 掩盖问题后直接上线
  • 忽略 curl 自带 CA 包与系统信任库路径不一致的情况
  • 只看退出码不看 -v 输出,无法判断是链、域名还是信任库问题
  • 把临时排查用的不安全选项提交进代码仓库,长期带着风险运行
  • 容器内 CA 包不完整却误判为服务端问题

数据来源与参考

  • curl 官方文档(--cacert / 退出码说明)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌