根本原因是php openssl/curl使用的ca根证书过期,需更新cacert.pem并正确配置php.ini中的openssl.cafile和curl.cainfo路径。

根本不是 Composer 自己的证书过期,而是 PHP 底层 OpenSSL/cURL 加载的 CA 根证书文件太旧,无法验证 ISRG Root X1(Let’s Encrypt 新根证书),DST Root CA X3 已于 2021 年 9 月彻底失效。修对地方,5 分钟内恢复。
怎么确认 PHP 当前用的是哪个 CA 证书文件
别猜路径,直接看 PHP 实际加载的位置:
- 运行
php -r "print_r(openssl_get_cert_locations());",重点关注default_cert_file和ini_cafile -
default_cert_file是 PHP 默认尝试读取的路径;如果为空、指向不存在的文件、或文件大小为 0,就是根因 -
ini_cafile是来自php.ini的显式配置;如果和default_cert_file不一致,说明配置未生效或加载了错误的php.ini - Windows 常见路径如
C:/php/extras/ssl/cacert.pem,Linux/macOS 多为/etc/ssl/certs/ca-certificates.crt或/etc/pki/tls/certs/ca-bundle.crt - 打开该文件,搜索
-----BEGIN CERTIFICATE-----后面的签发时间——若最后更新是 2022 年以前,基本可以确定是它
下载并配置最新 cacert.pem(跨平台通用)
必须用官方维护的证书包,别信 XAMPP/WAMP 自带的旧文件(多数停更于 2021 年):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 去 https://www.php.cn/link/04c165998a3bfee2c2b46a8d8840dacc 下载最新
cacert.pem - 保存到稳定路径,例如:
• macOS/Linux:/usr/local/etc/php/cacert.pem
• Windows:C:/php/extras/ssl/cacert.pem - 编辑
php.ini(用php --ini确认位置),确保这两行存在且路径完全一致:openssl.cafile="/path/to/cacert.pem"curl.cainfo="/path/to/cacert.pem" - 路径必须用正斜杠
/或双反斜杠\;单反斜杠会被 PHP 当作转义符解析失败
为什么 composer config -g cafile 大概率没用
它只影响 Composer 自己封装的 HTTP 客户端(php-http),而实际发 HTTPS 请求的是 PHP 的 cURL 或 OpenSSL 扩展。真正起效的只有这两个配置项,且必须同时存在、路径完全一致:
-
curl.cainfo控制 cURL 请求的证书验证 -
openssl.cafile控制file_get_contents、stream_context_create等 OpenSSL 接口 - 即使设置了
composer config -g cafile,如果openssl.cafile指向无效路径,部分底层请求仍会失败 - 验证是否生效:
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 安全边界——依赖投毒、中间人劫持、凭证泄露风险全部打开。它们唯一用途是快速验证是否真是证书问题,而不是修复它。
真正稳定的方案是让 PHP 正确加载一份完整、新鲜的 cacert.pem,并且确保 CLI 和 Web 环境都使用同一份配置。最容易被忽略的是:改完 php.ini 后,CLI 模式要关掉终端重开,Web 模式必须重启 php-fpm / Apache / Nginx —— 光 reload 配置不生效。










