Composer 报 SSL verification failed 的本质是 PHP cURL 扩展无法验证 HTTPS 服务器证书链,主因是本地 OpenSSL 证书库缺失、过期或配置错误;需检查 openssl.cafile/curl.cainfo 路径并更新为有效 cacert.pem,代理环境须合并代理根证书。

Composer 报错 SSL verification failed,本质是 PHP 的 cURL 扩展在发起 HTTPS 请求时,无法验证远程服务器(如 packagist.org)的 SSL 证书链。这不是 Composer 本身的问题,而是本地 OpenSSL 证书信任库缺失、过期或配置异常导致的。
为什么 Composer 会报 SSL verification failed
Composer 默认通过 HTTPS 访问 Packagist,依赖系统或 PHP 内置的 CA 证书包来校验服务器证书。常见原因包括:
- Windows 上 PHP 使用了自带的旧版
curl-ca-bundle.crt,且未随 OpenSSL 更新 - macOS 或 Linux 系统缺少
ca-certificates包,或路径未被 PHP/cURL 正确识别 - 公司代理/防火墙劫持 HTTPS 流量,返回自签名中间证书,而该证书未被信任
- PHP 配置中
openssl.cafile或curl.cainfo指向了空文件、损坏路径或过期 PEM 文件
检查并修复 PHP 的 CA 证书配置
先确认当前 PHP 使用的证书路径:
php -r "print_r(openssl_get_cert_locations());"
重点关注 default_cert_file 和 capath。若 default_cert_file 是空、不存在或内容为空,就需手动指定。操作步骤如下:
- 下载最新 Mozilla CA 证书包:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,保存为本地路径(如
/usr/local/etc/php/cacert.pem或C:\php\extras\ssl\cacert.pem) - 编辑
php.ini,取消注释并修改两行:
openssl.cafile=/path/to/cacert.pem curl.cainfo=/path/to/cacert.pem
重启 Web 服务或 CLI 环境后,运行 php -m openssl 和 composer diagnose 验证是否生效。
临时绕过(仅限调试,切勿用于生产)
不推荐长期禁用 SSL 验证,但若需快速验证是否为证书问题,可临时设置:
composer config -g secure-http false
或强制跳过验证(危险):
export COMPOSER_DISABLE_TLS=1 # 或 Windows: set COMPOSER_DISABLE_TLS=1
⚠️ 注意:COMPOSER_DISABLE_TLS=1 会让所有 HTTPS 请求降级为 HTTP,存在中间人攻击风险;secure-http false 仅允许非 HTTPS 的仓库源,不解决证书失败本身。
代理环境下的特殊处理
如果身处企业内网且使用 HTTPS 代理,cURL 通常无法自动信任代理注入的证书。此时不能简单换 CA 包,而应:
- 导出代理的根证书(通常是管理员提供 .crt 或 .pem 文件)
- 将该证书追加到你指定的
cacert.pem文件末尾:cat proxy-root.crt >> cacert.pem - 确保
curl.cainfo指向这个合并后的文件 - 避免设置
http_proxy/https_proxy环境变量后又走 Composer 的proxy配置,二者混用易触发双重 TLS 解密失败
真正麻烦的不是“怎么关 SSL”,而是弄清证书信任链断在哪一环——系统层?PHP 层?网络中间设备层?漏掉任意一层,改了配置也白搭。










