curl 报错 (60) "unable to get local issuer certificate" 怎么解决
curl (60) 表示服务器证书验证失败,可能是本机信任库、服务器中间证书链或企业 CA 配置问题。本文给出保持证书校验开启的排查方法。
一句话回答:这个错误表示 curl 在本机找不到可信任的 CA 根证书来验证服务器的证书链。首选方案是更新/重装系统的 CA 证书包(Ubuntu:sudo apt install --reinstall ca-certificates);不行就手动下载 CA bundle 并用 curl --cacert cacert.pem 指定;-k 跳过校验只能临时调试用,生产环境禁用。
方案一:更新 CA 证书包(首选)
先用 curl -V 和 curl -v 确认 TLS 后端、实际信任库及错误详情。若确定系统 CA 包缺失或过旧,可按发行版更新:
# Debian / Ubuntu
sudo apt update && sudo apt install --reinstall ca-certificates
sudo update-ca-certificates
# CentOS / RHEL / Fedora
sudo yum reinstall ca-certificates
sudo update-ca-trust
# Arch
sudo pacman -Syu ca-certificates
# macOS(Homebrew 装的 curl 用自己的证书)
brew install ca-certificates
Windows 上采用 Schannel 的 curl 通常使用系统证书库;其他构建可能使用文件式 CA bundle。以 curl -V 及构建文档为准,更新系统不一定更新独立的 CA 文件。
方案二:手动指定 CA Bundle
证书装了但 curl 找不到(常见于自编译 curl、容器精简镜像):
# 从已能正常校验 HTTPS 的受信任环境下载 CA bundle;不要用 -k 下载信任根
curl -O https://curl.se/ca/cacert.pem
# 单次指定
curl --cacert ./cacert.pem https://example.com
# 或设环境变量,整个会话生效
export CURL_CA_BUNDLE=/path/to/cacert.pem
方案三:临时跳过校验(仅限调试)
curl -k https://example.com # 或 --insecure
风险警告:-k 放弃了对服务器身份的验证,等于敞开中间人攻击的大门。仅在隔离测试中排查时考虑,勿携带密码、Token 或业务数据;成功也不能证明服务端身份可信,确认后应回头修复证书链,而不是把 -k 留在脚本里。
服务端的问题也要考虑
curl (60) 不总是客户端的锅。服务器证书链不完整(缺中间证书)是另一个高发原因——某些浏览器/TLS 后端可利用缓存或 AIA 获取中间证书,而另一些客户端没有这一路径,因此表现可能不同;服务器仍应发送正确证书链。检查:
openssl s_client -connect example.com:443 -servername example.com
# 看 "Verify return code" 和证书链是否完整
如果链不完整,需要在服务器上把中间证书和站点证书合并成 fullchain(Let's Encrypt 用户用 fullchain.pem 而不是 cert.pem)。
容器/CI 场景
精简镜像需要核对是否包含 CA bundle;并非所有 distroless 镜像都缺少证书,且它们通常不能直接运行包管理器。下面是有包管理器的基础镜像示例:
# Alpine
RUN apk add --no-cache ca-certificates
# Debian slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
常见问题(FAQ)
Q:浏览器访问正常,为什么 curl 报错?
A:两个常见原因:服务器缺中间证书,不同客户端对缓存/AIA 的支持不同;或浏览器与 curl 所用信任库、TLS 后端和代理设置不同。不能一概断言所有 curl 后端都不获取中间证书。
Q:公司内网代理环境下报这个错?
A:公司代理做 TLS 审查时用的是内部 CA。需要把公司的根证书导入系统信任库(Ubuntu 放到 /usr/local/share/ca-certificates/ 后 sudo update-ca-certificates),而不是用 -k 绕过。
Q:git clone 也报类似证书错误?
A:Git 的 HTTPS 传输使用 libcurl,但构建、TLS 后端和 CA 配置可能与命令行 curl 不同。检查 Git 的 http.sslBackend / http.sslCAInfo,为可信企业 CA 配置正确证书链;不要关闭全局 http.sslVerify。单次使用自定义 CA 可用 git -c http.sslCAInfo=/trusted/ca.pem clone https://example.com/repo.git,路径须由管理员确认。
核查依据
本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。