根本原因是php底层ca根证书文件过旧或路径无效,需通过php -r "print_r(openssl_get_cert_locations());"确认default_cert_file和ini_cafile是否指向真实存在的非空pem文件,并在php.ini中同步设置openssl.cafile与curl.cainfo为同一最新cacert.pem绝对路径,改后必须重启php环境。

不是 Composer 本身证书过期,而是 PHP 底层加载的 CA 根证书文件太旧(比如还包含已停用的 DST Root CA X3),或路径根本不存在——修对 php.ini 里的 openssl.cafile 和 curl.cainfo 就能恢复,不用关 TLS。
怎么确认是 CA 文件问题而不是网络或代理
别猜,直接让 PHP 自己说话:
- 运行
php -r "print_r(openssl_get_cert_locations());" - 重点看输出里的
default_cert_file和ini_cafile:路径是否为空、是否指向一个真实存在的文件、文件大小是否 > 0 - 如果路径是
C:phpextrassslcurl-ca-bundle.crt(Windows)或/usr/local/etc/php/8.3/openssl.cafile(macOS Homebrew),但该文件压根没下载或已被删,就是根因 - 再补一刀:
curl -v https://packagist.org/packages.json,如果也报SSL certificate problem,说明是 cURL/PHP 层失效,不是 Composer 特有问题
下载并配置最新 cacert.pem(跨平台通用)
必须用 Mozilla 官方维护的最新证书包,别信 XAMPP/WAMP 自带的旧文件(多数停更于 2021 年):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 下载地址:https://www.php.cn/link/04c165998a3bfee2c2b46a8d8840dacc
- 保存到稳定路径,例如:
• Windows:C:/php/extras/ssl/cacert.pem
• macOS:/usr/local/etc/php/cacert.pem
• Linux:/etc/ssl/certs/cacert.pem - 编辑 CLI 模式下真正生效的
php.ini(先跑php --ini确认Loaded Configuration File路径) - 确保这两行同时存在、路径完全一致、且为绝对路径:
openssl.cafile="/path/to/cacert.pem"curl.cainfo="/path/to/cacert.pem"
注意:Windows 路径用正斜杠/或双反斜杠\,单反斜杠会被 PHP 当作转义符解析失败
为什么 composer config --global cafile 总是不起作用
这条命令只影响 Composer 自己封装的 HTTP 客户端(基于 php-http),而实际发起 HTTPS 请求的是 PHP 的 cURL 或 OpenSSL 扩展:
- 它无法覆盖
curl.cainfo的优先级,也不能修复底层 TLS 握手失败 - 你执行
composer config --global cafile /path/to/cacert.pem后,composer diagnose可能显示 “CA file configured”,但composer install依然报错,就是典型表现 - 一旦涉及 Git 克隆、cURL 直连或某些插件调用,还是会走 PHP 原生扩展,绕不开
php.ini配置
改完之后必须做的事
配置写对只是第一步,环境不重载等于白改:
- CLI 模式:必须关闭当前终端,新开一个——光
source ~/.zshrc或刷新 shell 不会 reload PHP 配置上下文 - Web 模式(Apache/Nginx/php-fpm):必须重启对应服务,不能只刷新页面或
service restart nginx(可能没 reload PHP 进程) - 验证是否生效:再次运行
php -r "print_r(openssl_get_cert_locations());",确认default_cert_file和ini_cafile已变成你刚写的路径,且文件可读 - 最后再跑
composer install——不要跳过前面验证,否则容易误判为“修了没用”
最容易被忽略的点是:CLI 和 Web SAPI 往往加载不同的 php.ini,which php 和 php -i | grep 'Loaded Configuration File' 输出的路径可能不一致;还有就是 Windows 下单反斜杠路径解析失败,看着配置写了,其实 PHP 根本没读进去。










