根本不用关ssl验证,95%的composer ssl报错是php找不到或读不了可信ca证书——修对php.ini里的openssl.cafile和curl.cainfo就行;需运行php -r "print_r(openssl_get_cert_locations());"确认default_cert_file和ini_cafile路径存在且可读,再下载https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251配置为绝对路径并重启cli环境。

根本不用关 SSL 验证,95% 的 Composer SSL 报错是 PHP 找不到或读不了可信 CA 证书——修对 php.ini 里的 openssl.cafile 和 curl.cainfo 就行。
怎么确认是证书路径问题而不是网络或代理
先跑这句命令,看 PHP 自己认不认证书:
php -r "print_r(openssl_get_cert_locations());"
重点看输出里的 default_cert_file 和 ini_cafile 路径是否存在、文件是否可读。如果路径是空的、指向一个不存在的文件、或权限为 000,那就是根因。
- Windows 常见情况:
default_cert_file指向C:phpextrassslcurl-ca-bundle.crt,但该文件压根没下载或被删了 - macOS(Homebrew PHP):默认不带 CA 包,
default_cert_file可能是/usr/local/etc/php/8.3/openssl.cafile,但目录下根本没有这个文件 - Linux(如 CentOS):路径可能是
/etc/pki/tls/cert.pem,但它是空链接或过期 bundle - 用
curl -v https://packagist.org/packages.json测试:如果 curl 也报SSL certificate problem,说明不是 Composer 特有问题,而是底层 curl/PHP 层失效
下载并配置正确的 CA 证书文件
别用系统自带的符号链接或旧包,直接用 Mozilla 官方维护的最新根证书:
下载地址:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251(2026 年仍在持续更新)
保存为本地绝对路径,比如:
- Windows:
C:phpextrassslcacert.pem - macOS:
/usr/local/etc/php/cacert.pem - Linux:
/etc/ssl/certs/cacert.pem
然后打开你 CLI 模式下真正生效的 php.ini(执行 php --ini 看 Loaded Configuration File):
- 取消注释或新增这两行(路径必须写绝对路径,不能用
~或相对路径):openssl.cafile=/path/to/cacert.pemcurl.cainfo=/path/to/cacert.pem - 改完保存,**关闭当前终端再新开一个**(CLI 下不需要重启 Apache/Nginx,但必须重载 PHP 配置上下文)
- 再运行
php -r "print_r(openssl_get_cert_locations());",确认default_cert_file和ini_cafile已变成你刚写的路径
为什么 composer config --global cafile 不起作用
这条命令只影响 Composer 自己封装的 HTTP 客户端(基于 php-http),而绝大多数 SSL 报错发生在 PHP 的 cURL 或 OpenSSL 扩展层——比如 copy('https://...')、file_get_contents()、或 Composer 内部调用的 curl_exec()。
-
composer config --global cafile /path/to/cacert.pem对copy()类函数完全无效 -
composer config --global secure-http false会让 Composer 允许 HTTP 源,但 Packagist 已强制 HTTPS,且此举会禁用所有 TLS 校验,凭据可能被中间人截获 -
composer config --global disable-tls true更危险,等同于裸奔,仅限离线调试时临时验证 - 真正生效的只有
php.ini中的openssl.cafile和curl.cainfo,它们控制整个 PHP 进程的证书信任链
容易被忽略的细节和陷阱
很多人配完以为好了,结果还是报错,往往卡在这几个地方:
- 改了 Web SAPI(如 Apache)的
php.ini,但 Composer 是在 CLI 下运行的——必须确认php --ini输出的是 CLI 对应的配置文件 - 路径用了反斜杠没转义(Windows):
openssl.cafile=C:phpcacert.pem在某些 PHP 版本里会被截断,推荐写成C:/php/cacert.pem或双反斜杠C:\php\cacert.pem - 文件权限问题(Linux/macOS):确保 PHP 进程用户(如
www-data或当前 shell 用户)有读取cacert.pem的权限,chmod 644 /path/to/cacert.pem - 证书文件本身损坏:下载中途断开可能导致 PEM 文件末尾缺失
-----END CERTIFICATE-----,用head -n 1 && tail -n 1 /path/to/cacert.pem检查头尾是否完整 - PHP 多版本共存:比如用
brew install php装了一个,又手动编译了一个,which php和php --ini可能指向不同环境











