答案是php未正确加载ca证书:运行php -r "print_r(openssl_get_cert_locations());"查看default_cert_file和ini_cafile路径,确保openssl.cafile与curl.cainfo在php.ini中指向同一最新cacert.pem文件,且路径绝对、无空格中文、权限正常。

cURL error 60、SSL certificate problem: unable to get local issuer certificate、The "@#@#@#@#@#@#@#@#@#@0" file could not be downloaded——这些报错不是 Composer 坏了,是 PHP 底层压根没加载有效的 CA 证书,导致所有 HTTPS 请求(无论官方源还是阿里云镜像)全部失败。
怎么确认 PHP 正在用哪个证书文件?
别猜路径,让 PHP 自己说:
运行 php -r "print_r(openssl_get_cert_locations());"
重点看这两项:
-
default_cert_file:PHP 默认尝试读的路径,如果为空、指向不存在的文件、或文件大小为 0,就是病灶 -
ini_cafile:来自php.ini的显式配置,如果和default_cert_file不一致,说明配置没生效,或加载了错误的php.ini
常见失效路径:/etc/ssl/certs/ca-certificates.crt(旧版 Ubuntu)、C:/php/extras/ssl/cacert.pem(XAMPP/WAMP 自带的老包)、/usr/local/etc/php/cacert.pem(Homebrew PHP 未更新时)
openssl.cafile 和 curl.cainfo 必须同时设、路径完全一致
Composer 同时依赖 PHP 的 cURL 和 OpenSSL 扩展发起 HTTPS 请求,这两个扩展各自读一个配置项:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
openssl.cafile控制 OpenSSL 层(如file_get_contents、stream_context_create) -
curl.cainfo控制 cURL 层(Composer 默认 HTTP 客户端底层)
只配一个?大概率仍有报错;路径写错(比如漏 .pem、用相对路径、Windows 下单反斜杠被当转义符)?照样失败。
正确做法:
- 从 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新
cacert.pem - 存到稳定绝对路径,例如:
/usr/local/etc/php/cacert.pem或C:/php/extras/ssl/cacert.pem - 在
php.ini中写两行,路径必须一模一样:openssl.cafile="/usr/local/etc/php/cacert.pem"curl.cainfo="/usr/local/etc/php/cacert.pem" - Windows 路径务必用正斜杠
/或双反斜杠\,别用单反斜杠
别信 composer config --global cafile
很多人试过 composer config -g cafile "/path/to/cacert.pem",但依然报错——因为该配置只影响 Composer 自封装的 HTTP 客户端(如 php-http 驱动),而实际触发 cURL error 60 的是底层 cURL 扩展,它根本不读这个配置。
临时禁用验证(composer config -g secure-http false 或 --no-secure-http)只是绕开症状,不解决证书链断裂这个核心问题。
换镜像源前先验证证书是否真通了
换阿里云镜像(composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/)能缓解网络问题,但如果你的证书根本没配好,换完照样报 cURL error 60。
改完 php.ini 后,务必验证底层是否就绪:
- 执行
php -r "$ch = curl_init('https://packagist.org'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); var_dump(curl_exec($ch));"—— 返回非false才算通 - 再跑
composer clear-cache,否则缓存里可能存着上次失败的元数据,重试还会卡住 - 注意 CLI 和 Web SAPI 的
php.ini可能不同,Composer 走的是 CLI 版本,php --ini看清加载的是哪个
最常被忽略的点:证书文件放在中文路径、空格路径、或 Program Files 下被系统/杀软拦截;换成 C:/Users/YourName/cacert.pem 这类路径更稳妥。










