确认错误是否真由证书引起:先运行curl -I https://packagist.org验证底层环境;若失败,说明PHP cURL或OpenSSL未连通可信CA;若成功而Composer失败,再查其配置。

确认错误是否真由证书引起
看到 SSL certificate problem: unable to get local issuer certificate 或 cURL error 60,别急着改配置。先验证是不是底层环境问题:运行 curl -I https://packagist.org。如果它也失败,说明不是 Composer 单独的问题,而是 PHP 的 cURL 或 OpenSSL 根本没连通可信 CA;如果 curl 成功但 composer install 失败,再查 Composer 层配置。
检查并设置 php.ini 中的证书路径
Composer 依赖 PHP 的 curl.cainfo 和 openssl.cafile 两个配置项定位根证书。它们必须指向同一个有效的 PEM 格式证书文件(如 cacert.pem),否则校验会静默失效。
- 用
php --ini找到 CLI 模式下实际加载的php.ini路径(注意:Web 服务器用的可能是另一个) - 打开该文件,确认
extension=openssl未被注释 - 搜索
curl.cainfo和openssl.cafile,取消注释并设为同一绝对路径,例如:curl.cainfo = "C:\php\extras\ssl\cacert.pem"openssl.cafile = "C:\php\extras\ssl\cacert.pem" - 路径中含空格或中文?换到
C:\cacert.pem这类干净路径,并用双引号包裹 - 改完后,用
php -r "print_r(openssl_get_cert_locations());"确认输出的cafile值与你设置的一致
下载并替换 cacert.pem 文件
Windows 下 PHP 自带的证书包往往陈旧,Linux/macOS 系统级证书也可能过期。不要复用旧文件,直接获取权威更新:
- 从 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新
cacert.pem(注意:浏览器右键「另存为」,别复制网页 HTML) - 保存为纯文本,确保文件头是
-----BEGIN CERTIFICATE-----,末尾是-----END CERTIFICATE----- - macOS 用户若用 Homebrew 安装了 OpenSSL,也可用
/opt/homebrew/etc/openssl@3/cert.pem这类路径,但需确认该文件存在且可读 - Linux 用户常见路径是
/etc/pki/tls/certs/ca-bundle.crt或/etc/ssl/certs/ca-certificates.crt,可用update-ca-trust或apt install ca-certificates更新系统证书库
排查代理和环境变量干扰
中文环境下,Clash、Surge、某些国产加速器常启用 MITM 模式,动态签发证书——但 PHP 默认不信任它们的根证书,导致握手卡在 TLS 层,错误可能表现为 SSL3_GET_SERVER_CERTIFICATE 或完全无响应。
- 临时关闭代理验证:Windows CMD 中运行
set HTTP_PROXY= && set HTTPS_PROXY= && composer install;macOS/Linux 运行HTTP_PROXY= HTTPS_PROXY= composer install - 若关闭后成功,说明代理是元凶。此时不应禁用 SSL,而应把代理的根证书(通常在代理 App 设置里可导出)追加进你的
cacert.pem,或单独设为composer config --global cafile /path/to/proxy-root.crt - 检查
phpinfo()输出中$_SERVER['HTTPS_PROXY']是否被意外注入,这类环境变量会强制 Composer 走代理,即使你没配镜像源
真正难调的是 CLI 和 Web SAPI 使用不同 php.ini,而 Composer 只走 CLI 版本;证书路径写错一个字符、引号漏掉、文件权限受限(尤其 Windows 下 Program Files 目录)、杀毒软件拦截 PEM 文件读取——这些细节比原理更决定成败。











