最稳妥解法是修改 php.ini 中的 curl.cainfo 或 openssl.cafile 指向有效 cacert.pem;需下载 Mozilla 官方证书、正确配置路径并重启服务,因 Composer 的 cafile 配置不作用于 PHP 底层 HTTPS 调用。

直接改 php.ini 里的 curl.cainfo 或 openssl.cafile 是最稳妥的解法,临时禁用 SSL 验证(composer config -g secure-http false)只适合离线调试,不建议长期用。
确认当前 PHP 使用的 CA 证书路径
Composer 依赖 PHP 的 cURL 和 OpenSSL 扩展验证 HTTPS,而它们默认从系统或 PHP 自身配置里找根证书。运行以下命令查看实际生效路径:
php -r "print_r(openssl_get_cert_locations());"
重点关注输出中的 default_cert_file 和 cafile 字段。如果值为空、路径不存在,或指向一个过期/损坏的 cacert.pem,就会报 SSL 验证失败。
下载并配置有效的 cacert.pem
推荐使用 Mozilla 维护的权威证书包,比系统自带更及时:
- 访问 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新
cacert.pem - 保存到一个固定路径,例如:
/usr/local/etc/php/cacert.pem(macOS/Linux)或C:\php\extras\ssl\cacert.pem(Windows) - 编辑你的
php.ini,添加或修改两行(二者选其一即可,优先用curl.cainfo):curl.cainfo="/usr/local/etc/php/cacert.pem" openssl.cafile="/usr/local/etc/php/cacert.pem"
- 重启 Web 服务或 CLI 环境,再执行
php -m | grep curl和composer diagnose验证是否生效
为什么不能只配 Composer 自己的 cafile?
Composer 的 config cafile(即 composer config -g cafile /path/to/cacert.pem)只影响 Composer 自身的 HTTP 请求,不控制 PHP 内部的 file_get_contents()、stream_context_create() 等调用——而某些插件、脚本或依赖安装过程会绕过 Composer 的 HTTP 封装,直接走 PHP 底层,此时仍会因系统证书缺失报错。所以必须从 PHP 层统一配置。
Windows 下常见陷阱
Windows 用户容易踩两个坑:
- 路径中用了反斜杠
\却没加转义或没用双引号,导致php.ini解析失败,应写成:curl.cainfo="C:\\php\\extras\\ssl\\cacert.pem"或curl.cainfo="C:/php/extras/ssl/cacert.pem" - PHP 版本混用:WAMP/XAMPP/手动安装的 PHP 可能有多个
php.ini(CLI 用一个,Apache 用另一个),务必确认你改的是php --ini显示的那一个
证书路径一旦配错,错误信息往往还是 “SSL certificate problem: unable to get local issuer certificate”,不会提示路径不存在——得靠 openssl_get_cert_locations() 实锤。










