Composer报SSL错误本质是OpenSSL证书链校验失败,需修复cafile路径、更新CA证书或配置企业根证书,禁用TLS仅限调试且不可上生产。

Composer 报 SSL 错误,本质不是 HTTPS 协议“坏了”,而是它在用 OpenSSL 验证远程仓库(如 packagist.org)的 TLS 证书时失败了。恢复的关键是让 composer 能正常完成证书链校验,而不是关掉 HTTPS。
为什么 composer install 突然报 SSL operation failed 或 certificate verify failed
这类错误通常出现在以下场景:
- 系统 OpenSSL 版本过旧(比如 CentOS 7 默认的 1.0.2),不支持现代 TLS 1.2+ 握手或已弃用的根证书
- PHP 编译时未正确链接系统 CA 证书路径(
openssl.cafile或openssl.capath为空或指向不存在的文件) - 公司内网代理/防火墙中间劫持了 HTTPS 流量,返回了自签名证书,而 PHP 不信任它
- 本地
ca-bundle.crt文件损坏、过期,或被手动替换为不完整版本
检查 PHP 的 OpenSSL 配置是否生效
运行 php -i | grep -i 'openssl\|ca',重点确认两行:
-
openssl.cafile => /etc/ssl/certs/ca-certificates.crt(Linux)或C:\xampp\php\extras\ssl\cacert.pem(Windows)——该路径必须存在且可读 -
openssl.capath => /etc/ssl/certs—— 目录下应有大量 .pem 文件(如 Ubuntu 的ca-certificates包会生成)
如果 cafile 是空值,或路径指向一个空文件/404 文件,composer 就无法验证任何 HTTPS 连接。不要改 php.ini 后就以为完事——记得重启 PHP-FPM 或 Apache,并用 php -m | grep openssl 确认模块已加载。
快速修复:用官方 ca-bundle 替换本地证书文件
别自己拼证书,直接用 Mozilla 维护的权威 bundle:
- Linux/macOS:
curl -sS https://curl.se/ca/cacert.pem -o /usr/local/etc/php/conf.d/cacert.pem && echo "openssl.cafile=/usr/local/etc/php/conf.d/cacert.pem" >> /usr/local/etc/php/conf.d/docker-php-ext-openssl.ini - Windows(XAMPP/WAMP):下载
cacert.pem到php\extras\ssl\,然后在php.ini中显式设置openssl.cafile="C:\xampp\php\extras\ssl\cacert.pem" - 验证是否生效:
php -r "print_r(openssl_get_cert_locations());"—— 输出中的default_cert_file必须是你刚设的路径
临时绕过(仅限调试,切勿上生产)
有些文档建议设 COMPOSER_DISABLE_TLS=1 或改 repo.packagist.org 为 HTTP,这等于把整个依赖安装过程裸奔在公网——密钥、token、私有包元数据全可能被截获。真要临时跳过校验,只应:
- 加环境变量:
export COMPOSER_CAFILE=/path/to/cacert.pem(优先级高于 php.ini) - 或单次运行:
composer install --no-plugins --no-scripts -v看具体哪步卡住,再针对性查证书
真正棘手的是 SNI 不兼容或企业中间人代理——这时需要让 OpenSSL 信任你公司的根证书,而不是屏蔽校验。这点常被忽略:证书问题从来不是“换一个更宽松的设置”就能解决的,而是得让信任链完整、时间准确、协议匹配。


















