90%的SSL证书错误源于PHP本地证书配置错误——需同时正确设置curl.cainfo和openssl.cafile为绝对路径指向有效的cacert.pem,并重启终端;composer config -g cafile仅作临时兜底,无法解决底层TLS握手失败。

不是 Composer 坏了,也不是镜像挂了,90% 的 SSL certificate problem 错误都出在本地 PHP 的证书配置上——curl.cainfo 和 openssl.cafile 没设对,或根本没设。
怎么确认是 PHP 证书路径问题,而不是网络或镜像故障
别急着换镜像或清缓存。先让 PHP 自己说真话:
- 运行
php --ini确认你编辑的是 CLI 模式下真正生效的php.ini(尤其 XAMPP、Homebrew、phpenv 环境常有多个) - 执行
php -r "print_r(openssl_get_cert_locations());",重点看ini_cafile是否为空、路径是否存在、文件大小是否 > 0 - 再跑
curl -v https://mirrors.aliyun.com/composer/packages.json:如果也报unable to get local issuer certificate,说明是 PHP/cURL 层级失效,和 Composer 配置无关
必须同时配 curl.cainfo 和 openssl.cafile
PHP 内部 HTTPS 请求分两路:一部分走 cURL 扩展,一部分走 OpenSSL 扩展(比如 stream context 场景)。只设一个,另一路仍会 fallback 到空信任链。
- 下载最新
cacert.pem:curl -sS https://curl.se/ca/cacert.pem -o /path/to/cacert.pem - Windows 推荐存到
C:/php/extras/ssl/cacert.pem;macOS/Linux 推荐/usr/local/etc/php/cacert.pem - 在
php.ini中添加两行(路径必须是绝对路径、英文双引号包裹):curl.cainfo = "C:/php/extras/ssl/cacert.pem"openssl.cafile = "C:/php/extras/ssl/cacert.pem" - 改完保存,**必须关闭当前终端、新开一个**——CLI 下不热加载,PHP 进程需重载上下文
composer config -g cafile 为什么经常不起作用
这条命令只影响 Composer 自己封装的 HTTP 客户端(基于 php-http),但实际发起 HTTPS 请求的是 PHP 的 cURL 或 OpenSSL 扩展——它无法覆盖 curl.cainfo 的优先级,也不能修复底层 TLS 握手失败。
- 可能显示 “CA file configured”,但
composer install依然报错,就是典型表现 - 它对 Git 克隆、插件调用、或任何绕过 Composer HTTP 客户端的操作完全无效
- 仅当
php.ini未统一配置时,可作为临时兜底:composer config -g cafile "C:/php/extras/ssl/cacert.pem"
最容易被忽略的一点:系统时间偏差超过 2 分钟也会触发同类错误(如 certificate has expired),但现象一模一样。校准时间前,别白折腾证书配置。


















