根本原因是php的openssl找不到可信根证书文件,需检查openssl.cafile配置及证书文件有效性;应下载cacert.pem并配置php.ini中的curl.cainfo和openssl.cafile,重启php进程生效。

根本原因不是网络不通,而是 PHP 的 OpenSSL 找不到可信的根证书文件——openssl.cafile 没设、设错了,或指向的文件已损坏/过期。
怎么确认是 CA 路径问题?
别猜,直接看 PHP 实际加载的证书路径:
- 运行
php -r "print_r(openssl_get_cert_locations());" - 重点看
default_cert_file和default_cert_dir的值是否真实存在、可读、非空 - 如果输出里
default_cert_file是空字符串、no value,或路径下文件是 0 字节/内容乱码,就是它了 - 再补一刀:执行
composer diagnose,若提示The openssl extension is loaded, but ssl.capath is not configured或SSL certificate problem: unable to get local issuer certificate,基本坐实
怎么配对 cafile(最稳的长期方案)
PHP 层级的 openssl.cafile 是第一优先级,改它比改 Composer 配置更彻底,且 CLI 和 Web 环境都生效。
- 下载权威证书包:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251(Mozilla 维护,每日更新)
- 保存到稳定路径,例如:
C:\php\extras\ssl\cacert.pem(Windows)或/usr/local/etc/php/cacert.pem(macOS/Linux) - 编辑你实际被加载的
php.ini(用php --ini确认路径),添加两行:curl.cainfo = "/usr/local/etc/php/cacert.pem"openssl.cafile = "/usr/local/etc/php/cacert.pem" - 重启 PHP 进程:CLI 下关掉所有终端重开;Web 环境需重启 Apache/Nginx/PHP-FPM
为什么不能只靠 composer config --global cafile?
这条命令只写进 Composer 的全局配置(~/.composer/config.json),但它只影响部分 HTTPS 请求,对底层 cURL 初始化、Git 克隆、甚至某些扩展调用无效——尤其当你遇到 curl error 60 或 stream_socket_enable_crypto(): SSL operation failed 时,Composer 自己的 cafile 已经晚了一步。
- 它不修复
php -r "file_get_contents('https://...')"失败的问题 - 在 CI 容器、Docker 或多 PHP 版本共存环境里,容易漏配、错配
- 某些旧版 Composer(
- 真正起作用的是 PHP 启动时读取的
openssl.cafile,不是 Composer 的“补丁”
临时绕过?仅限离线调试,且必须知道代价
禁用验证只是掩盖症状,不是修复。真要用,务必清楚后果:
-
COMPOSER_DISABLE_TLS=1 composer install:跳过全部 TLS 握手,中间人攻击风险拉满 -
git config --global http.sslVerify false:影响所有 Git 操作,不止 Composer -
composer config --global secure-http false:允许降级到 HTTP,但 Packagist 已强制 HTTPS,实际会报错 - 企业网/代理环境下,这类操作常和 Zscaler、Netskope 等 HTTPS 解密设备冲突,反而让错误更隐蔽
最容易被忽略的一点:CLI 和 Web SAPI 加载的是两个不同的 php.ini。你改了 Apache 的 php.ini,但 composer install 是在终端跑的,它读的是 CLI 模式下的配置——务必用 php --ini 和 php -i | grep "Loaded Configuration File" 双重确认。










