"SSL certificate problem: unable to get local issuer certificate" 怎么解决

unable to get local issuer certificate 可能来自服务端缺中间证书或客户端 CA 信任配置。先定位缺失环节,通过可信渠道配置 CA,保持 TLS 身份验证。

最佳实践
加密网络与通信桥梁插画

一句话回答:含义是"本机找不到能验证服务器证书的 CA 根证书"。两条主路:修好本机 CA 库(重装 ca-certificates 包、更新系统),或显式指定 CA 文件**——通过已验证的 HTTPS 或受控分发渠道取得 curl 提供的 Mozilla CA bundle 后 curl 用 --cacert 指定、PHP 在 php.ini 里设 curl.cainfo、Git 设 http.sslCAInfo。不要把 -k 或关闭验证当作修复方案。**

通用解法:更新系统 CA 库

# Debian/Ubuntu
sudo apt install --reinstall ca-certificates && sudo update-ca-certificates

# CentOS/RHEL
sudo yum reinstall ca-certificates && sudo update-ca-trust

# macOS(brew 装的工具用自己的证书库)
brew install ca-certificates

显式指定 CA 文件

curl 提供从 Mozilla CA 数据导出的 CA bundle。下载通道必须可信,不能用 -k 获取新信任锚。企业 CA 不在公共 bundle 中,须从 IT 可信渠道核验。

curl:

curl --cacert /path/to/cacert.pem https://example.com
# 或环境变量
export CURL_CA_BUNDLE=/path/to/cacert.pem

PHP(php.ini):

curl.cainfo = "C:\path\to\cacert.pem"
openssl.cafile = "C:\path\to\cacert.pem"

改完重启 Web 服务(Apache/php-fpm)。PHP stream 与 cURL 使用的配置不同;Guzzle、WordPress 还可能覆盖 CA 路径。核对实际传输后端及有效配置。

Git:

# 仅在受影响仓库内设置
git config --local http.sslCAInfo /path/to/cacert.pem

别忘了服务端的可能性

"unable to get local issuer" 也常是服务器没发中间证书导致的——某些浏览器可能通过缓存或下载中间证书而成功,其他客户端仍报错;差异不是浏览器不严格校验。用 SSL Labs 或 openssl s_client -connect 域名:443 -servername 域名 -showcerts 看链是否完整;缺中间证书就让运维把 fullchain 配上,这比改所有客户端更彻底。

常见问题(FAQ)

Q:内网服务自签证书,客户端都报错怎么办?

A:把内网 CA 的根证书(不是站点证书)分发到各机器的 CA 库:Linux 放 /usr/local/share/ca-certificates/ 后 update-ca-certificates;Java 应用需核对应用级 truststore。别用 -k 满天飞。

Q:certifi/pip/Node 也报类似的错?

A:错误可能相似,但仍需分别核对原因和信任路径:pip 按版本检查系统信任/certifi 并按需设 PIP_CERT;Node 设 NODE_EXTRA_CA_CERTS=/path/ca.pem。思路都是给它一份完整的 CA 列表。

Q:什么时候可以用 -k(不验证证书)?

A:优先用验证错误详情定位;即使在隔离环境短暂对照,也不能发送凭据、下载执行代码或据此认定服务可信。不能写入正式脚本、配置或生产代码。


参考资料

本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台