根本原因是php底层未加载可信ca证书,需同时在php.ini中配置curl.cainfo和openssl.cafile指向同一绝对路径的cacert.pem文件,并重启环境;通过php --ini和openssl_get_cert_locations()确认路径有效性,而非更换镜像或禁用tls。

根本不是镜像的问题,而是 PHP 底层没加载可信 CA 证书——改对 php.ini 里的 curl.cainfo 和 openssl.cafile 就能恢复,不用换镜像、不用关 TLS。
怎么确认是 CA 证书路径问题,而不是镜像或网络故障
别靠猜,让 PHP 自己说:
- 运行
php --ini,确认 CLI 模式下真正生效的php.ini路径(Web 和 CLI 常用不同配置文件) - 再跑
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file和ini_cafile两项:是否为空?路径是否存在?文件大小是否 > 0? - 顺手执行
curl -v https://mirrors.aliyun.com/composer/packages.json:如果也报SSL certificate problem: unable to get local issuer certificate,说明是 PHP/cURL 层级失效,和镜像无关
必须同时配置 curl.cainfo 和 openssl.cafile 且路径一致
这两个配置项必须写在同一份 php.ini 中,值必须是绝对路径、指向同一个 cacert.pem 文件。只改一个,或路径不一致,PHP 仍 fallback 到空信任链。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 下载权威证书包:
curl -sS https://curl.se/ca/cacert.pem -o /path/to/cacert.pem - Windows 推荐存到
C:/php/extras/ssl/cacert.pem(注意:单反斜杠会被解析为转义符,必须写成"C:/php/extras/ssl/cacert.pem"或"C:\php\extras\ssl\cacert.pem") - macOS/Linux 推荐存到
/usr/local/etc/php/cacert.pem(路径不能含~,必须绝对) - 在
php.ini末尾添加两行(双引号包裹,路径完全相同):curl.cainfo = "/path/to/cacert.pem"openssl.cafile = "/path/to/cacert.pem"
为什么 composer config --global cafile 总是不起作用
这条命令只影响 Composer 自己封装的 HTTP 客户端(基于 php-http),而实际发起 HTTPS 请求的是 PHP 的 cURL 或 OpenSSL 扩展——它无法覆盖 curl.cainfo 的优先级,也不能修复底层 TLS 握手失败。
- 你执行后
composer diagnose可能显示 “CA file configured”,但composer install依然报错,就是典型表现 - 一旦涉及 Git 克隆、
curl直连、或某些插件调用,还是会走 PHP 底层,绕过该配置 - 临时禁用验证(如
COMPOSER_DISABLE_TLS=1)会彻底放弃 HTTPS 安全边界,依赖投毒风险直线上升
最容易被忽略的是:改完 php.ini 后必须关闭当前终端、新开一个——CLI 模式下 PHP 不热加载配置,重开终端才能 reload 上下文;另外,系统时间偏差超过 5 分钟也会导致证书被拒,记得先 date 核对时间。










