根本原因是PHP OpenSSL扩展未正确配置cafile路径,需通过php -r "print_r(openssl_get_cert_locations());"确认default_cert_file有效性,并在php.ini中同步设置openssl.cafile与curl.cainfo指向同一最新CA证书文件,改完必须重启PHP环境。

直接说结论:这不是 Composer 镜像的问题,而是你本地 PHP 的 OpenSSL 扩展无法验证 HTTPS 证书链——核心要修的是 php.ini 里的证书路径,不是换镜像或关校验。
php -r "print_r(openssl_get_cert_locations());" 输出什么?
这是唯一可信的起点。别猜路径,直接运行这行命令,重点看两个字段:
-
default_cert_file:PHP 默认尝试读取的 CA 文件,比如/etc/ssl/certs/ca-certificates.crt -
ini_cafile或openssl.cafile:php.ini 中显式设置的路径(如果设置了)
如果 default_cert_file 是空、指向不存在的文件、或文件内容为空(head -n 1 /path/to/file 返回空),那问题就在这里。Linux/macOS 用户优先更新系统 CA 包:sudo apt install --reinstall ca-certificates(Debian/Ubuntu)或 sudo dnf reinstall ca-certificates(RHEL/CentOS 8+)。改完必须重启 PHP 进程(CLI 下新开终端,Web 下重启 PHP-FPM/Apache/Nginx)。
composer config -g cafile /path/to/cacert.pem 为什么有时不生效?
因为 Composer 的 cafile 配置只影响自身 HTTP 客户端,而底层仍依赖 PHP 的 OpenSSL 扩展做 TLS 握手和证书验证。如果你的 openssl.cafile 在 php.ini 里没设对,或者 PHP 根本没加载 openssl 扩展,composer config 写的路径只是“备选”,起不了兜底作用。
- 确认 openssl 扩展已启用:
php -m | grep openssl必须有输出 - 确认 php.ini 里设置了
openssl.cafile="/etc/ssl/certs/ca-certificates.crt"(路径必须绝对、可读、带双引号) - Windows 用户注意:路径用正斜杠或双反斜杠,
C:/php/certs/cacert.pem可行,C:\php\certs\cacert.pem可能被截断 - 执行
php -i | grep "openssl.cafile"看是否真生效
用了阿里云镜像还报 SSL 错误,是不是镜像证书有问题?
不是。阿里云镜像(https://mirrors.aliyun.com/composer/)用的是标准 Let’s Encrypt 证书,和 packagist.org 一样受信任。报错本质仍是本地 PHP 缺根证书或 OpenSSL 版本太老。
- OpenSSL 3.x 默认禁用 SHA-1 签名算法,而某些旧 CA 包含过时根证书——此时必须更新 CA 包,不能只靠
composer config - 下载最新 Mozilla CA 包:
curl -L https://curl.se/ca/cacert.pem -o /usr/local/share/ca-certificates/cacert.pem,再执行update-ca-certificates(Debian/Ubuntu) - 然后在 php.ini 中设
openssl.cafile="/etc/ssl/certs/ca-certificates.crt"(系统更新后路径通常不变) - 若用 Docker,别用
alpine:3.14这类老镜像;改用php:8.3-cli-alpine3.20或官方 Debian 基础镜像
最容易被忽略的一点:CLI 和 Web SAPI 加载的是不同 php.ini。你改了 Apache 的 php.ini,但 composer install 是在终端跑的,它读的是 CLI 的配置。务必用 php --ini 确认当前 CLI 实际加载的文件路径,再动手改。


















