PHP HTTPS验证失败主因是CA证书路径未正确配置,需通过openssl_get_cert_locations()确认default_cert_file存在且可读,并在php.ini中同步设置openssl.cafile与curl.cainfo指向同一最新CA bundle文件,改完必须重启PHP环境。

直接改 php.ini,不是 Composer 配置问题,也不是网络或镜像问题——CA 证书路径没设对,PHP 就根本不会信任任何 HTTPS 连接。
确认 PHP 实际加载的 CA 路径是否有效
别猜,先看 PHP 自己认不认这个证书文件:
- 运行
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file的值是否指向一个真实存在的、非空的 PEM 文件 - 如果输出是
no value、空字符串、或路径下文件不存在/权限不足/内容为空(比如只有几个换行),就是它了 - 再跑一次
composer diagnose,如果提示The openssl extension is loaded, but ssl.capath is not configured或CA bundle not found,基本坐实
在 php.ini 中同时设置 curl.cainfo 和 openssl.cafile
只配一个不够。cURL 和 OpenSSL 是两套底层机制,Composer 内部会混用,漏掉任一配置都可能在某次请求中失败:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 下载最新
cacert.pem:用curl -sS https://curl.se/ca/cacert.pem -o /usr/local/etc/php/cacert.pem(macOS/Linux)或保存到C:/php/extras/ssl/cacert.pem(Windows) - 编辑你实际被加载的
php.ini(用php --ini确认路径),添加两行(路径必须是绝对路径,且用正斜杠或双反斜杠):curl.cainfo = "/usr/local/etc/php/cacert.pem"openssl.cafile = "/usr/local/etc/php/cacert.pem" - 改完必须重启:CLI 下关掉所有终端重开;Web 环境要重启 Apache/Nginx/PHP-FPM,否则新配置不生效
为什么 composer config -g cafile 不够用
这条命令只写进 ~/.composer/config.json,只影响 Composer 自己发起的部分 HTTPS 请求,但绕不过 PHP 底层的 cURL 初始化和 OpenSSL 加载逻辑:
- 遇到
cURL error 60、stream_socket_enable_crypto(): SSL operation failed或 Git 克隆私有仓库失败时,cafile配置已经晚了一步 - 尤其在 Docker 容器、CI 环境或混合使用 CLI/Web 的项目里,硬编码路径会导致不可移植;其他工具(如
git clone https://)依然报错 - 它只是临时补丁,不是修复根因——系统级 CA 包长期不更新,迟早会在别的地方爆出来
验证是否真修好了
别只跑 composer install 看有没有报错,那只是表面:
- 执行
php -r "echo file_get_contents('https://packagist.org/packages.json');",能打印 JSON 就说明 PHP 层 HTTPS 已通 - 再跑
composer diagnose,确认不再出现CA bundle not found提示,且The openssl extension is loaded和The curl extension is loaded后面没有警告 - 注意:CLI 和 Web 环境可能加载不同的
php.ini,务必分别验证;which php和php -i | grep 'Loaded Configuration File'必须对得上
最常被忽略的是 PHP 实例不一致——你改了 CLI 的 php.ini,但 Web 服务跑的是另一个 PHP 版本,或者用了 Homebrew、XAMPP、Docker 的独立环境。证书路径对了,但没对准真正干活的那个 PHP,就等于白配。

















