应直接修改php.ini中curl.cainfo和openssl.cafile指向最新Mozilla官方cacert.pem文件,通过php -r "print_r(openssl_get_cert_locations());"确认证书路径有效,且CLI与Web环境php.ini需分别配置,改后必须重启终端生效。

直接改 php.ini 里的 curl.cainfo 和 openssl.cafile,指向一个真实存在、内容有效、路径绝对的 cacert.pem 文件——95% 的通信失败不是网络或镜像问题,而是 PHP 根本没加载到可信 CA。
怎么确认是根证书缺失,而不是网络或代理问题
别猜,跑这行命令看 PHP 自己认不认证书:
php -r "print_r(openssl_get_cert_locations());"
重点盯输出里的 default_cert_file 和 ini_cafile:
- 如果值为空、路径不存在、文件大小为 0 或最后修改时间早于 2022 年,就是证书缺失或过期
- 如果
curl.cainfo和openssl.cafile指向不同路径,或其中一个根本没配,就会出现「cURL 能通但 Composer 报错」这类看似矛盾的现象 - 再补测一句:
curl -v https://packagist.org/packages.json,如果 curl 也报SSL certificate problem: unable to get local issuer certificate,说明是底层证书层失效,不是 Composer 特有问题
下载和配置 cacert.pem 的实操要点
别用系统自带的旧包(XAMPP/WAMP 的 curl-ca-bundle.crt 多已停更),必须用 Mozilla 官方维护的最新版:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 下载地址固定为:
https://curl.se/ca/cacert.pem—— 不要用浏览器右键另存为 HTML,得用curl或wget直接保存为纯文本 UTF-8 文件 - Windows 推荐路径:
C:/php/extras/ssl/cacert.pem(注意用正斜杠或双反斜杠,单反斜杠会转义) - macOS(Homebrew PHP)推荐路径:
/usr/local/etc/php/cacert.pem;Linux(Debian/Ubuntu)可用系统默认:/etc/ssl/certs/ca-certificates.crt - 在你 CLI 环境真正生效的
php.ini(运行php --ini看Loaded Configuration File)里加两行,路径必须写绝对路径,不能用~或相对路径:
curl.cainfo = "/path/to/cacert.pem" openssl.cafile = "/path/to/cacert.pem"
改完保存,**关掉当前终端,新开一个**——CLI 下重启 Apache/Nginx 没用,必须重载 PHP 配置上下文。
验证是否真生效,而不是“以为改好了”
三个命令缺一不可:
-
php -r "var_dump(file_exists('/path/to/cacert.pem'));"→ 必须返回bool(true) -
php -r "echo ini_get('curl.cainfo');"和php -r "echo ini_get('openssl.cafile');"→ 两个输出必须一致,且等于你刚写的绝对路径 -
php -r "print_r(openssl_get_cert_locations());"→ 再看一遍,ini_cafile和default_cert_file是否已同步更新
如果只做了前两步就去跑 composer install,大概率还是失败——第三步才是确认 PHP 真的“看见”了那个文件。
最容易被忽略的是:CLI 和 Web 服务可能加载完全不同的 php.ini,而 composer install 只走 CLI 环境。哪怕你在 /etc/php/8.3/apache2/php.ini 里改对了,CLI 用的可能是 /etc/php/8.3/cli/php.ini。务必先用 php --ini 锁定目标文件,再动手。

















