答案是php未加载ca证书,需运行php -r "print_r(openssl_get_cert_locations());"确认default_cert_file为空或无效,再下载权威cacert.pem并统一配置curl.cainfo和openssl.cafile为同一绝对路径,最后重启环境。

php -r "print_r(openssl_get_cert_locations());" 输出里 default_cert_file 为空或路径无效
这是最直接的证据:PHP 根本没加载任何 CA 证书。别急着改 Composer 配置,先确认这个路径是否真实存在、文件是否可读、大小是否大于 10KB(小于说明是空包或损坏)。Windows 用户尤其容易看到类似 "d:/tmp/openssl-1.0.1m/vc11/x86/cert.pem" 这种临时编译路径,它根本不存在。
解决办法很实在:
- 下载权威
cacert.pem(必须来自 curl.se,不是系统自带也不是第三方打包) - 保存到稳定位置:Windows 推荐
C:/php/extras/ssl/cacert.pem,macOS Homebrew 推荐/opt/homebrew/etc/ca-certificates/cert.pem,Linux 推荐/usr/local/etc/php/cacert.pem - 在你实际被加载的
php.ini中同时写入两行:curl.cainfo = "/path/to/cacert.pem"openssl.cafile = "/path/to/cacert.pem" - 路径必须是绝对路径,Windows 用正斜杠或双反斜杠,单反斜杠会被 PHP 当作转义符解析
composer diagnose 报 SSL certificate problem: unable to get local issuer certificate
这说明 PHP 的 OpenSSL 扩展在 TLS 握手阶段就失败了,不是 Composer 自己的问题,而是底层 cURL 或 stream wrapper 拿不到可信根证书。此时跑 curl -v https://packagist.org/packages.json 如果也报同样错误,就彻底排除网络和代理干扰,坐实是本地证书链断裂。
常见踩坑点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 只配了
curl.cainfo没配openssl.cafile—— 两者必须一致且都生效,否则某些场景(如 Git 克隆、插件调用)仍走 fallback 路径 - 改完
php.ini没重启:CLI 下要关掉所有终端重开;Web 下必须重启 Apache/Nginx/php-fpm,光刷新页面没用 - 误信
composer config --global cafile能解决问题 —— 它只影响 Composer 封装的 HTTP 客户端,对底层 TLS 握手完全无效
curl -v https://packagist.org 能通,但 composer install 卡住或报错
说明系统级 curl 和 PHP 内置 cURL 用的是两套证书配置。系统 curl 可能读的是 /etc/ssl/certs/ca-certificates.crt,而 PHP 默认不认这个路径,尤其 macOS Homebrew PHP 默认忽略 /etc/ssl/certs,Linux 某些发行版里该路径甚至只是个 000 权限的符号链接。
验证并统一配置:
- 运行
php -r "print_r(curl_version());"看ssl_version是否支持 TLS 1.2+;再跑php -r "print_r(openssl_get_cert_locations());"确认 PHP 实际读哪个文件 - 不要试图让 PHP 去读系统路径,直接把
cacert.pem放到你可控的位置,然后硬编码进php.ini - 验证是否生效:
php -i | grep -E "(curl.cainfo|openssl.cafile)",输出必须是你刚写的路径,且文件存在、可读
用了国内镜像源还是 SSL 握手失败
镜像源本身不解决本地证书问题。阿里云、腾讯云等镜像站也是 HTTPS 服务,照样需要本地 CA 信任链完整。如果镜像域名已停服(比如旧的 https://packagist.phpcomposer.com),还会触发 DNS 解析失败或 502 错误,但这和证书无关。
排查优先级:
- 先确保
curl -v https://mirrors.aliyun.com/composer/packages.json能通 —— 如果不通,说明镜像不可达或 DNS 问题 - 再确认当前 Composer 配置没残留失效镜像:
composer config -g repo.packagist查看值,如果是过期地址,立刻切到新地址:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 镜像切换不能替代证书修复 —— 即便用了镜像,
composer install里若含 Git 仓库依赖,仍会直连 GitHub,照样触发本地 TLS 验证
php.ini 却忘了重开终端,或是以为配了 cafile 就万事大吉,结果 openssl.cafile 还是空的。路径写错、权限不对、服务没重启——这些细节不验一遍,问题永远在原地打转。










