这不是 Composer 本身的问题,而是 PHP 的 OpenSSL 或 cURL 扩展在验证 HTTPS 证书时找不到可信的根证书(CA),最稳妥的解法是配置正确的 cacert.pem 路径并启用 openssl 扩展;临时禁用 SSL 验证仅适合本地调试,切勿用于生产环境。

直接说结论:这不是 Composer 本身的问题,而是 PHP 的 OpenSSL 或 cURL 扩展在验证 HTTPS 证书时找不到可信的根证书(CA),最稳妥的解法是配置正确的 cacert.pem 路径并启用 openssl 扩展;临时禁用 SSL 验证仅适合本地调试,切勿用于生产环境。
检查 openssl 扩展是否启用且证书路径有效
Composer 报 SSL certificate problem: unable to get local issuer certificate,第一件事不是改 Composer 配置,而是确认底层 PHP 是否真能做 TLS 验证。
- 运行
php -m | grep openssl,输出里必须有openssl;没有就打开php.ini,取消extension=openssl前的分号 - 运行
php -r "print_r(openssl_get_cert_locations());",重点关注ini_cafile和default_cert_file对应的路径 —— 如果为空或指向不存在的文件,就是问题根源 - Windows 用户常见情况:
php.ini里写了openssl.cafile="C:\php\cacert.pem",但实际cacert.pem文件根本没下载或路径写错(比如漏了盘符、用了反斜杠没转义)
下载并正确设置 cacert.pem 文件
PHP 自身不带完整 CA 证书包,必须手动提供。别用随便搜到的旧证书,优先用官方维护的最新版。
- 从 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新
cacert.pem(注意是 .pem 后缀,不是 .crt) - 保存到一个稳定路径,例如:
C:\php\cacert.pem(Windows)、/opt/homebrew/etc/openssl@3/cert.pem(macOS Homebrew)、/etc/ssl/certs/ca-certificates.crt(Linux) - 在
php.ini中同时设置两项(缺一不可):curl.cainfo="/path/to/cacert.pem"openssl.cafile="/path/to/cacert.pem" - 改完后重启命令行终端(Windows CMD/PowerShell、macOS Terminal),再运行
php -r "print_r(openssl_get_cert_locations());"确认路径已生效
为什么 composer config --global secure-http false 不总管用
这个命令只告诉 Composer “允许仓库用 HTTP”,但它不绕过 PHP 底层的证书校验。真正抛出 certificate verify failed 错误的是 file_get_contents() 或 curl_exec(),不是 Composer 的逻辑层。
- 如果你执行
curl -I https://packagist.org也失败,说明问题在系统或 PHP,不是 Composer 配置能解决的 -
composer config -g disable-tls true在新版 Composer 中已被废弃,无效 - 临时应急可用环境变量:
COMPOSER_NO_SSL=1(Linux/macOS)或set COMPOSER_NO_SSL=1(Windows CMD),但只是跳过校验,不修复证书缺失本质 - 更安全的折中方案:切国内镜像源 + 保留证书验证:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,再配合composer clear-cache
macOS 和 Windows 的典型陷阱
这两个系统最容易踩坑,因为它们默认不把 CA 证书暴露给 PHP CLI 环境。
- macOS(尤其是 Apple Silicon):Homebrew 安装的 PHP 默认读不到系统钥匙串,必须显式指定
openssl.cafile指向 Homebrew 的证书路径,例如/opt/homebrew/etc/openssl@3/cert.pem;用which php确认你改的是 CLI 使用的那个php.ini - Windows:不要把
cacert.pem放在含中文或空格的路径(如C:\Users\张三\Downloads\),PHP 会解析失败;也不要依赖 MAMP/XAMPP 自带的证书 —— 它们常过期,建议单独下载并硬编码路径 - 所有系统都要验证:改完
php.ini后,运行php -r "echo file_get_contents('https://packagist.org/packages.json') ? 'OK' : 'FAIL';",能输出 OK 才算真正修好
最常被忽略的一点:改了 php.ini 之后,很多人只重启了 Web 服务器(如 Apache/Nginx),却忘了命令行 PHP 是独立加载配置的 —— 你必须新开一个终端窗口,再试 composer install。否则看到的还是旧配置。


















