curl 校验失败怎么查
curl 的证书校验失败会给出明确的退出码,配合 -v 输出可以完整还原握手过程。排查顺序是:先看退出码判断大类,再从输出里读 subject 与 issuer 确认拿到的到底是哪张证书,最后判断问题出在信任链、域名还是本地信任库。需要强调:-k 只适合临时定位,绝不能留在脚本或配置里。
退出码对照
| 60 | unable to get local issuer certificate,本地信任库不含签发者 |
|---|---|
| 51 | 证书无法用已知 CA 验证 |
| 35 | SSL connect error,握手失败 |
| 77 | CA 证书文件读取失败 |
| 83 | issuer 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 | 握手失败 | 核对协议版本、端口与套件 |
| 77 | CA 文件读取失败 | 检查路径与读取权限 |
| 83 | issuer 检查失败 | 核对预期签发者与实际值 |
排查结束后必须恢复校验;长期使用 -k 会掩盖中间人风险,而且这类风险很难从日志中被发现。
容器与精简镜像是高频盲区:基础镜像里未必装有完整的 CA 包,更新 CA 后也需要重新加载;典型现象是同一域名在宿主机正常、在容器内报 60。
企业代理会替换根证书:issuer 显示为内部根而不是公开 CA 时,说明流量经过代理解密,这本身是预期行为,但必须确认代理证书的来源可信。