直接补全 php 的 ca 证书路径即可解决,根源是 php 的 curl 和 openssl 在中文环境(windows 中文路径、macos 中文用户名、docker 无证书包)下无法定位或读取根证书文件。

直接补全 PHP 的 CA 证书路径就能解决,不是 Composer 或网络问题,而是 PHP 的 cURL 和 OpenSSL 在中文环境(尤其是 Windows 中文路径、macOS 中文用户名、Docker 容器内无证书包)下找不到或读不了根证书文件。
确认当前 CLI PHP 真正加载的证书路径
很多人改错配置文件,因为 Web 和 CLI 模式用的是两份 php.ini。先定位真实生效位置:
- 运行
php --ini查看 Loaded Configuration File 路径 - 再执行
php -r "print_r(openssl_get_cert_locations());" - 重点检查输出中的
default_cert_file和ini_cafile:若为空字符串、路径不存在、或文件大小为 0,就是根源 - 中文系统常见失效路径:
C:phpextrassslcacert.pem(但该目录根本没创建)、/Users/张三/homebrew/etc/php/cacert.pem(含中文用户名导致 PHP 静默失败)
下载并配置 cacert.pem 到纯英文绝对路径
Mozilla 维护的 cacert.pem 是唯一推荐来源,别用系统自带过期包或符号链接:
- 从 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载,保存为纯文本,后缀必须是
.pem(不是.pem.txt) - 存到稳定路径,例如:
C:/php/cacert.pem(Windows,用正斜杠更稳妥)、/usr/local/etc/php/cacert.pem(macOS/Linux) - 路径中严禁出现中文、空格、
~、点号或相对路径——PHP 会静默忽略,不报错也不生效 - 确保文件权限可读:Linux/macOS 下运行
ls -l /path/to/cacert.pem,权限至少为-rw-r--r--
同时设置 curl.cainfo 和 openssl.cafile
只配一个会失效,因为 PHP 内部不同模块走不同 SSL 栈:
- 在上一步查到的 CLI
php.ini文件末尾添加两行(路径用英文双引号包裹): curl.cainfo = "C:/php/cacert.pem"openssl.cafile = "C:/php/cacert.pem"- Windows 用户注意:单反斜杠
在 PHP 字符串里是转义符,务必用正斜杠/或双反斜杠\ - 改完保存,**必须关闭所有终端窗口,重新打开命令行**——CLI 进程不会热加载 ini 配置
验证是否真正生效
别信 composer diagnose 显示 “CA file configured”,它只反映 Composer 自己的配置,不反映底层 cURL 实际行为:
- 运行
php -r "var_dump(ini_get('curl.cainfo'));",输出应为你刚写的完整路径 - 运行
curl -v https://packagist.org/packages.json 2>&1 | findstr "certificate"(Windows)或curl -v https://packagist.org/packages.json 2>&1 | grep certificate(macOS/Linux),不再出现SSL certificate problem - 最后执行
composer install,如果仍失败,说明有其他扩展缺失(如intl、mbstring),需单独启用
最容易被忽略的一点:Docker 容器里即使你配对设置了 curl.cainfo 和 openssl.cafile,如果基础镜像(如 alpine:latest)压根没装 ca-certificates 包,PHP 仍可能 fallback 到空证书链——此时必须先运行 apk add --no-cache ca-certificates && update-ca-certificates(Alpine)或 apt install --reinstall ca-certificates(Debian/Ubuntu),再配 PHP 的 ini。











