根本原因是php的curl扩展未加载可信根证书,需配置php.ini中curl.cainfo和openssl.cafile指向同一有效cacert.pem绝对路径;先运行php -r "print_r(openssl_get_cert_locations());"和curl -v https://packagist.org/packages.json验证,二者均报ssl错误即可确认。

Composer 装包报 certificate 错误,90% 不是网络或镜像问题,而是 PHP 的 cURL 扩展根本没加载可信根证书——得修 php.ini,不是改 composer.json 或重装 Composer。
怎么确认真是证书问题,而不是网络/代理/防火墙?
别猜,先跑两行命令看底层是否通:
- 执行
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file和ini_cafile字段:为空、路径不存在、文件大小为 0,就是它了 - 再跑
curl -v https://packagist.org/packages.json:如果也报SSL certificate problem或unable to get local issuer certificate,说明问题在 PHP/cURL 层,和 Composer 无关 - 顺手跑
composer diagnose,盯住HTTPS connectivity这一行,标ERROR才值得继续往下查
为什么 composer config --global cafile 没用?
这个命令只影响 Composer 自己封装的 HTTP 客户端(比如 php-http),但绝大多数 SSL 报错发生在 cURL 或 OpenSSL 扩展层——composer config 根本不控制它们。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 真正起效的是
php.ini里的curl.cainfo和openssl.cafile,且必须指向同一个有效的 PEM 文件 - 路径必须是绝对路径:
/usr/local/etc/php/cacert.pem✅,~/cacert.pem❌,.cacert.pem❌ - Windows 上单反斜杠
C:phpextrassslcacert.pem会被 PHP 当作转义符解析失败,得用正斜杠C:/php/extras/ssl/cacert.pem或双反斜杠C:\php\extras\ssl\cacert.pem
证书文件从哪来?怎么配才不踩坑?
别用系统自带的符号链接(如 /etc/ssl/certs/ca-certificates.crt),PHP 有时读不了;优先用 Mozilla 官方维护的 cacert.pem:
- 下载地址:
https://curl.se/ca/cacert.pem(权威、实时更新) - Linux/macOS 推荐存到:
/usr/local/etc/php/cacert.pem(Homebrew PHP)或/etc/ssl/certs/ca-certificates.crt(Debian/Ubuntu,但需验证是否可读) - Windows 推荐存到:
C:/php/extras/ssl/cacert.pem,然后在php.ini里写:curl.cainfo = "C:/php/extras/ssl/cacert.pem"和openssl.cafile = "C:/php/extras/ssl/cacert.pem" - 改完必须重启:CLI 下关掉终端重开;Web 环境(Apache/Nginx + php-fpm)必须重启服务,光刷新页面无效
临时绕过只用于诊断,且必须知道风险
仅当确认环境可控(如本地 Docker、CI 构建机无外网)、且无法立即修复 CA 配置时使用:
- 单次命令绕过:
COMPOSER_DISABLE_TLS=1 composer install(Linux/macOS)或set COMPOSER_DISABLE_TLS=1 && composer install(Windows CMD) - 切勿在生产脚本中固化
COMPOSER_DISABLE_TLS=1或secure-http false,这等于放弃 HTTPS 证书校验,依赖投毒风险极高 - 如果绕过后成功,100% 是证书链问题——立刻删掉环境变量,回头修
php.ini
最容易被忽略的一点:CLI 和 Web SAPI 往往加载不同的 php.ini。运行 php --ini 看 CLI 加载的是哪个,phpinfo() 看 Web 加载的是哪个,别改错文件。










