95%的composer ssl失败源于php.ini中curl.cainfo和openssl.cafile路径错误,需用php -r "print_r(openssl_get_cert_locations());"确认default_cert_file和ini_cafile有效性,并统一设为同一绝对路径的最新cacert.pem文件,改后必须重启cli。

php.ini里curl.cainfo和openssl.cafile路径不对
95%的 Composer SSL 连接失败,根源是 PHP 找不到可信 CA 证书文件——不是镜像问题,也不是网络不通,而是 php.ini 里两个关键配置指向了空路径、不存在的文件,或用了相对路径/波浪号(~)。
先确认 CLI 模式下真正生效的配置文件:php --ini 输出的 Loaded Configuration File 路径才是你要改的地方。
- 运行
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file和ini_cafile的值:为空、路径不存在、文件大小为 0(比如只有几 KB),就是它了 - Windows 用户必须加双引号:
curl.cainfo="C:/php/extras/ssl/cacert.pem"或curl.cainfo="C:\php\extras\ssl\cacert.pem"(反斜杠需转义或换正斜杠) - macOS/Linux 必须用绝对路径,例如:
openssl.cafile="/usr/local/etc/php/cacert.pem",不能写~/certs/cacert.pem - 证书文件必须从 Mozilla 官方下载:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251(截至 2026 年仍在持续更新)
系统时间偏差导致证书“过期”
报错含 SSL certificate problem: certificate has expired,但你知道证书没真过期?大概率是本地系统时钟快了或慢了超过 2 分钟。OpenSSL 校验证书 notBefore/notAfter 时间戳,偏差一大会直接拒绝连接。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Linux/macOS:运行
timedatectl status | grep "System clock synchronized",输出yes才算校准成功;若否,执行sudo timedatectl set-ntp true并重启systemd-timesyncd - Windows:以管理员身份运行
w32tm /resync;如果失败,先net start w32time,再指定可靠源:w32tm /config /syncfromflags:manual /manualpeerlist:"time.nist.gov pool.ntp.org" - 别信右下角“已同步”,它可能只同步过一次。对比 time.is,误差应 ≤ 1 秒
composer config --global cafile 基本无效
这个命令只影响 Composer 自己封装的 HTTP 请求(比如 composer install 主流程),但解析 composer.json 中仓库 URL、校验 composer.lock 签名等环节,仍走 PHP 底层 cURL 或 OpenSSL——完全绕不开 php.ini 配置。
- 它写入的是用户级配置(如
%APPDATA%\Composer\config.json),对 Web 环境、Docker 容器、CI runner 等场景完全不生效 - 在容器里跑 CI?
cafile配置根本不会被加载,必须通过挂载证书文件 + 修改容器内php.ini实现 - 验证是否真生效:
php -r "var_dump(ini_get('curl.cainfo'));",输出必须是你刚写的绝对路径
curl -v https://packagist.org/packages.json 也失败
如果连 curl 都报 SSL certificate problem: unable to get local issuer certificate,说明问题出在 PHP/cURL 底层,不是 Composer 配置能解决的。这时候别折腾 composer config,直接回退到证书路径和系统时间排查。
- 临时绕过(仅限调试):
COMPOSER_DISABLE_TLS=1 composer install,或composer install --no-secure-http——但它们不解决证书校验本身,只是跳过 HTTPS 强制要求 - 企业环境常见干扰:Zscaler、Netskope 等 HTTPS 解密代理会替换证书,需额外导入其根证书到系统或 PHP 证书链
- 某些旧 OpenSSL 版本在 CDN 场景(如 Cloudflare 后的镜像站)下对 SNI 处理异常,表现为卡 30 秒后超时,
curl -v正常但 Composer 卡住
php -r "print_r(openssl_get_cert_locations());" 说话。










