根本原因是php的openssl和curl未统一配置证书路径,必须将curl.cainfo与openssl.cafile均设为同一份mozilla官方cacert.pem的绝对路径,并验证文件存在、可读且路径一致。

根本原因不是镜像或网络,而是 PHP 的 OpenSSL 和 cURL 没法验证证书链——必须统一配置 curl.cainfo 和 openssl.cafile 指向同一份最新 cacert.pem 文件。
先确认当前证书路径是否有效
别猜路径、别翻 php.ini、别信“系统自带证书已更新”——直接让 PHP 告诉你它在用什么:
运行 php -r "print_r(openssl_get_cert_locations());",重点看两个字段:
-
default_cert_file:如果为空、是相对路径、或指向一个不存在的文件(比如C:/php/extras/ssl/cacert.pem但该目录下根本没有这个文件),就必然失败 -
ini_cafile:如果为空,说明 php.ini 里没配openssl.cafile;如果不为空但和default_cert_file不一致,也会出问题
用 ls -l /path/to/file(Linux/macOS)或 dir C:\path\to\file(Windows)验证文件是否存在、大小是否 > 0 KB。若路径是符号链接,用 readlink -f 看真实路径,并确认权限至少为 644。
下载并配置官方 cacert.pem
必须用 Mozilla 官方维护的证书包,地址是:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251。其他来源(包括系统自带、XAMPP 自带、所谓“中文版 CA 库”)都不可靠。
下载后存到一个稳定路径,例如:
- Linux/macOS:
/usr/local/etc/php/cacert.pem(Homebrew 用户可用/opt/homebrew/etc/ca-certificates/cacert.pem) - Windows:
C:/php/cacert.pem(避免单反斜杠,用正斜杠或双反斜杠)
然后在 CLI 模式下真正生效的 php.ini(运行 php --ini 查看 Loaded Configuration File)末尾添加:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
curl.cainfo = "/usr/local/etc/php/cacert.pem" openssl.cafile = "/usr/local/etc/php/cacert.pem"
注意:两行路径必须完全一致、必须是绝对路径、必须用英文双引号包裹、不能有多余空格。
别跳过这三步验证
改完配置不验证等于没改。执行以下检查:
- 重启终端或命令行窗口(环境变量和配置缓存会延续)
- 再跑一次
php -r "print_r(openssl_get_cert_locations());",确认default_cert_file和ini_cafile都指向你刚写的路径,且文件可读 - 运行
composer diagnose,输出中应显示CA file: /your/path/cacert.pem,且没有 SSL 相关警告
如果仍报 SSL certificate problem: unable to get local issuer certificate 或 curl error 60,大概率是路径写错、文件权限不对、或改错了 php.ini(比如改了 Apache 的却在 CLI 下测试)。
国内镜像不是解药,只是辅助
阿里云、腾讯云等镜像站用的是 ISRG Root X1(Let’s Encrypt 新根证书),旧版 cacert.pem(2021 年前更新的)根本不认识它。所以换镜像后还报 SSL 错误,恰恰说明本地证书配置没到位。
临时禁用 SSL 验证(如 composer config -g secure-http false 或 COMPOSER_NO_SSL=1)只适合内网调试,生产环境绝不能用——它掩盖了证书信任链断裂的真实风险,且无法解决某些底层 stream context 报错(如 SSL3_GET_SERVER_CERTIFICATE)。
真正关键的,是让 PHP 的 OpenSSL 和 cURL 同时信任同一份权威证书。路径错一个字符、权限少一位、配置漏一行,都会导致「有时行、有时不行」的诡异现象。










