直接改php.ini中curl.cainfo和openssl.cafile为同一绝对路径的最新cacert.pem文件并重启环境,可解决95%的SSL验证失败问题;需用php -r "print_r(openssl_get_cert_locations());"和curl -v命令确认是否为证书路径问题。

直接改 php.ini 里的 curl.cainfo 和 openssl.cafile,指向同一个最新 cacert.pem 文件,95% 的 SSL 验证失败问题当场解决。禁用 TLS 只是掩盖问题,不是修复。
怎么确认真是证书路径问题,而不是网络或代理?
别猜,跑两行命令看真相:
-
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 提示 ssl.capath is not configured 或 cafile is not set,也是同一信号。
为什么 composer config --global cafile 大概率没用?
它只影响 Composer 自己封装的 HTTP 客户端(php-http),而实际发 HTTPS 请求的是 PHP 的 cURL 或 OpenSSL 扩展。真正起效的只有这两个配置项,且必须同时存在、路径完全一致:
curl.cainfo = "/path/to/cacert.pem"openssl.cafile = "/path/to/cacert.pem"
路径必须是绝对路径;Windows 上单反斜杠 会被解析为转义符,要用正斜杠 / 或双反斜杠 \;Linux/macOS 路径不能用 ~。
证书文件从哪来、怎么放、怎么验证生效?
去权威源下载最新 Mozilla 根证书包:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251(2026 年持续更新)
- 保存到稳定路径,例如:
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) - 在文件末尾添加上述两行配置,保存
- 必须重启:CLI 环境关掉终端重开;Web 环境重启
php-fpm/ Apache / Nginx - 验证:
php -r "var_dump(file_get_contents(ini_get('curl.cainfo')) !== false);"输出bool(true)即可
临时绕过只适合排查,不是解法
像 COMPOSER_DISABLE_TLS=1、composer config -g secure-http false 或把 Packagist 改成 HTTP,确实能跳过报错,但会彻底放弃 HTTPS 安全边界——依赖投毒、中间人劫持、凭证泄露风险全部打开。它们唯一用途是快速验证“是不是证书问题本身”,一旦确认,立刻停用。尤其容易被忽略的是:CLI 和 Web SAPI 加载的 php.ini 往往不同,改错位置等于白改。


















