最直接的修复方式是执行 composer config --global cafile 指定系统ca证书路径,该配置优先级最高且仅影响composer,配合 composer diagnose 验证生效。

composer config --global cafile 是最直接的修复方式
Composer 2.2+ 原生支持通过 cafile 配置项指定证书路径,它优先级高于 PHP 的 openssl.cafile 和 curl.cainfo,且只影响 Composer 自身网络请求,不波及其他 PHP 应用——这是最干净、最推荐的长期方案。
- 先确认系统级 CA 文件存在且可用:
ls -l /etc/ssl/certs/ca-certificates.crt(Ubuntu/Debian)或ls -l /etc/pki/tls/certs/ca-bundle.crt(RHEL/CentOS) - 执行命令写入全局配置:
composer config --global cafile /etc/ssl/certs/ca-certificates.crt - 验证是否生效:
composer diagnose输出中应出现CA file: /etc/ssl/certs/ca-certificates.crt并标为 OK - 若用 macOS Homebrew PHP,路径通常是
/opt/homebrew/etc/ca-certificates/cert.pem,别硬套 Linux 路径
php.ini 中 curl.cainfo 比 openssl.cafile 更可靠
PHP 的 curl 扩展才是 Composer 实际发起 HTTPS 请求的底层组件,curl.cainfo 是 cURL 自己读取的证书路径,而 openssl.cafile 是 OpenSSL 库用的——当两者不一致时,cURL 行为以 curl.cainfo 为准,且 Composer 显式依赖它。
- 运行
php --ini找到 CLI 模式下加载的php.ini路径 - 在该文件中添加或取消注释:
curl.cainfo = "/etc/ssl/certs/ca-certificates.crt" - 不要留空值或指向不存在的文件,否则
composer diagnose会报unable to get local issuer certificate - 改完不用重启 Web 服务,但需新开终端或运行
php -r "echo ini_get('curl.cainfo');"确认已加载
SSL read: error 不是网络不通,而是 TLS 握手卡在证书验证环节
这个错误本质是 OpenSSL 在读取服务器发来的加密记录时失败,常见于证书链不完整、CA 包过期、或中间代理(如 Zscaler、Netskope)做 SSL 解密后重签证书但未把企业根证书推送到本地信任库。
- 不是 DNS 或防火墙问题:运行
php -r "echo file_get_contents('https://repo.packagist.org/packages.json');"若同样失败,说明是 PHP/cURL 层面问题,非 Composer 特有 - 别急着关验证:临时设
composer config --global secure-http false只会让 Composer 接受 HTTP 源,但SSL read: error是 HTTPS 连接本身失败,这招无效 - 检查代理干扰:执行
echo $HTTPS_PROXY,若非空,先unset HTTPS_PROXY再试;企业环境建议联系 IT 获取内部根证书并导入系统 CA 库 - OpenSSL 版本太老(如 1.0.2)也会触发该错误,
openssl version查看,1.1.1 或 3.x 更稳妥
Windows 下 XAMPP/WAMP 用户最容易漏掉 cacert.pem 文件
官方 PHP Windows ZIP 包和部分集成环境(如旧版 XAMPP)默认不附带完整 CA 证书包,curl.cainfo 指向的路径常为空或只有占位文件,导致所有 HTTPS 请求失败。
- 手动下载最新证书:
curl -L https://curl.se/ca/cacert.pem -o C: mppphpextrassslcacert.pem - 编辑
php.ini,确保这两行都存在且路径正确:curl.cainfo="C: mppphpextrassslcacert.pem"和openssl.cafile="C: mppphpextrassslcacert.pem" - 注意反斜杠:Windows 路径在
php.ini中必须用双反斜杠\或正斜杠/,单反斜杠会被解析为转义符 - 别信“自动更新”:某些 WAMP 控制面板声称可更新证书,实际只是改了 ini 配置,文件本身仍为空,务必手动验证文件大小和内容
真正麻烦的不是找不到证书路径,而是多个地方(系统 CA 库、PHP ini、Composer config、环境变量)可能同时起作用,且优先级隐晦。最稳的做法是:先用 composer config --global cafile 锁死,再用 composer diagnose 看它最终用了哪个文件——其他配置没被读到,就不用管。










