应修改php.ini中openssl.cafile和curl.cainfo为同一绝对路径的cacert.pem,重启服务后验证生效;禁用SSL验证仅限临时排查,不可用于生产环境。

直接改 php.ini,别碰 composer config --global cafile —— 它对绝大多数 SSL 报错完全无效。
确认是不是证书问题本身
先跑两行命令快速定位:
-
php -r "print_r(openssl_get_cert_locations());"—— 看default_cert_file指向的路径是否存在、文件大小是否 >0 -
curl -v https://packagist.org/packages.json—— 如果也报SSL certificate problem或unable to get local issuer certificate,说明是 PHP/cURL 层级问题,不是 Composer 特有
如果 composer diagnose 提示 ssl.capath is not configured 或 cafile is not set,也是同一类信号。
改对 php.ini 才真正起效
composer config --global cafile 只影响 Composer 自己封装的 HTTP 客户端(php-http),而实际发起 HTTPS 请求的是 PHP 的 cURL 或 OpenSSL 扩展。真正起效的是这两个配置项,且必须同时设、路径一致:
openssl.cafile="/path/to/cacert.pem"curl.cainfo="/path/to/cacert.pem"
注意:/path/to/cacert.pem 必须是绝对路径;Windows 上可用正斜杠 / 或双反斜杠 \,单反斜杠 \ 会被解析为转义符。
证书文件从哪来、怎么放、怎么验证
去官方地址下载最新权威证书包:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,保存为本地文件,例如:
- Linux/macOS:
/usr/local/etc/php/cacert.pem - Windows:
C:/php/extras/ssl/cacert.pem
编辑你 CLI 模式下实际加载的 php.ini(运行 php --ini 看 Loaded Configuration File 路径),在末尾添加上面两行配置。改完必须重启:
- CLI:关掉终端重开,否则
php -i | grep cainfo还是旧值 - Web 环境:重启 Apache/Nginx 或
php-fpm,光刷新页面没用
验证是否生效:php -r "var_dump(file_get_contents(ini_get('curl.cainfo')) !== false);" 应输出 bool(true)。
为什么临时禁用 TLS 不是解法
像 COMPOSER_DISABLE_TLS=1、composer config -g secure-http false 或改仓库为 HTTP 协议,确实能跳过报错,但会暴露依赖投毒风险。它们只适合快速验证是否为证书问题本身,不能作为长期方案。尤其容易被忽略的是:同一台机器上 CLI 和 Web SAPI 可能加载不同的 php.ini,改错位置等于白改;还有些环境(如 XAMPP、Laragon)自带证书但路径未被识别,得手动对齐。


















