composer ssl错误根源是php未加载有效ca证书,需在php.ini中同时配置openssl.cafile和curl.cainfo为同一绝对路径的cacert.pem文件,并重启服务验证。

composer diagnose 说 SSL 失败,其实是 PHP 没读到证书文件
运行 composer diagnose 出现 SSL certificate problem: certificate has expired 或 cURL error 60,不是 Composer 自己坏了,而是 PHP 的 openssl 或 curl 扩展压根没加载有效的 CA 证书文件。这个命令只是暴露了底层问题,不解决路径配置,光跑 diagnose 没用。
-
composer diagnose会调用 PHP 的file_get_contents()和curl_exec(),这两者都依赖openssl.cafile和curl.cainfo配置 - 如果这两个 ini 项为空、指向不存在的路径、或文件内容为空/过期(比如只剩 DST Root CA X3),
diagnose就必然失败 - 别信“重装 Composer”或“换镜像源”——这些操作绕不开 PHP 层级的证书信任链
怎么快速确认是哪个证书路径失效
先执行这行命令,看 PHP 实际在用谁:
php -r "print_r(openssl_get_cert_locations());"
重点盯两个字段:
-
default_cert_file:PHP 默认尝试加载的路径,如果为空、ls -l显示文件大小为 0,或最后修改时间早于 2022 年,基本就是它 -
ini_cafile:来自php.ini的显式配置,如果和default_cert_file不一致,说明你改错了配置文件,或者没加载到它
再补一刀验证:
curl -v https://packagist.org/packages.json
如果也报 SSL certificate problem,说明不是 Composer 独有问题,整个 PHP/cURL 层级的信任链断了。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
Windows 下 php.ini 必须同时设对两处且路径一致
Windows 环境(XAMPP/WAMP/phpEnv)最容易栽在这里。单设 curl.cainfo 不够,openssl.cafile 也必须同步配,否则部分请求(比如 PHAR 签名校验)仍会失败。
- 路径必须用正斜杠
/或双反斜杠\,例如C:/php/extras/ssl/cacert.pem或C:\php\extras\ssl\cacert.pem;单反斜杠会被 PHP 当作转义符解析失败 - 别用 XAMPP 自带的
curl-ca-bundle.crt——它最后一次更新是 2021 年,2024 年后已完全失效 - 从 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新
cacert.pem,存到稳定路径,比如C:/php/extras/ssl/cacert.pem - 在 CLI 模式实际加载的
php.ini(运行php --ini看Loaded Configuration File)末尾加上:
openssl.cafile="C:/php/extras/ssl/cacert.pem" curl.cainfo="C:/php/extras/ssl/cacert.pem"
改完必须关掉当前终端、新开一个——CLI 模式下不重启进程,新配置不生效。
为什么 composer config -g cafile 不起作用
很多人试过 composer config -g cafile "C:/cacert.pem",但 composer diagnose 还是报错。这是因为:
- 这个配置只影响 Composer 自己封装的 HTTP 客户端(如
php-http库),而diagnose中的 SSL 校验走的是原生 PHP 的curl和openssl扩展,它们完全不读composer.json或config.json - 对
packagist.org这类默认源,cafile配置根本不会被触发 -
composer config -g secure-http false更危险:Packagist 自 2022 年起已强制 HTTPS,设了这个反而会让composer install直接退出
真正起效的只有 php.ini 里的 openssl.cafile 和 curl.cainfo ——而且必须指向同一个有效的 PEM 文件,路径必须是绝对路径,改完必须重启对应环境。










