根本原因是PHP的openssl扩展无法验证HTTPS证书链,需配置openssl.cafile指向有效的系统或自定义CA证书文件,而非禁用TLS验证。

为什么 composer install 会报 SSL operation failed?
根本原因是 Composer 默认通过 HTTPS 请求 Packagist(如 https://packagist.org),而 PHP 的 openssl 扩展无法验证服务器证书链——常见于系统 CA 证书过旧、PHP 编译时未正确链接系统证书路径,或企业代理/防火墙中间人劫持了 TLS 连接。
错误典型表现:
file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
这不是 Composer 自身 bug,而是底层 PHP cURL 或 stream 尝试建立 HTTPS 连接时被拒绝。
检查并修复 PHP 的 OpenSSL 证书路径
Composer 依赖 PHP 的 openssl.cafile 或 openssl.capath 配置来验证证书。多数问题出在该配置为空或指向了不存在/过期的证书文件。
- 运行
php --ini查看当前生效的php.ini路径 - 打开该
php.ini,搜索openssl.cafile - 若未设置,需手动添加(Linux/macOS 推荐用系统证书):
openssl.cafile=/etc/ssl/certs/ca-certificates.crt(Debian/Ubuntu)openssl.cafile=/etc/pki/tls/certs/ca-bundle.crt(CentOS/RHEL)openssl.cafile=/usr/local/etc/openssl/cert.pem(macOS Homebrew PHP) - Windows 用户可下载最新
cacert.pem(如从 curl.se),然后写绝对路径:openssl.cafile=C:\php\extras\ssl\cacert.pem - 改完后重启 Web 服务或 CLI 环境,并用
php -r "print_r(openssl_get_cert_locations());"验证路径是否生效
临时绕过验证(仅限调试,禁止生产)
不推荐长期使用,但可用于快速定位是否为证书问题本身:
- 全局禁用(危险!):
composer config -g secure-http false—— 这会让 Composer 允许 HTTP 源,但 Packagist 已强制 HTTPS,实际无效 - 真正起效的是跳过 TLS 验证:
export COMPOSER_DISABLE_TLS=1(Linux/macOS)或set COMPOSER_DISABLE_TLS=1(Windows CMD) - 更细粒度控制:在
composer.json中为特定仓库关闭验证(不推荐):"repositories": [ { "type": "composer", "url": "https://packagist.org", "options": { "ssl": { "verify_peer": false, "verify_peer_name": false } } } ]
注意:COMPOSER_DISABLE_TLS=1 会同时禁用所有 HTTPS 请求的证书校验,包括私有仓库,存在中间人攻击风险。
国内用户优先考虑镜像 + 证书双重保障
单纯配证书不能解决 DNS 污染或连接超时问题。建议组合使用:
- 切换官方镜像(如阿里云):
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 确认镜像站使用有效证书(阿里云、腾讯云等均支持标准 HTTPS,无需额外信任)
- 若仍报错,大概率是本地环境证书缺失,此时应优先修复
openssl.cafile,而非继续降级安全策略 - 某些企业网络会替换 TLS 证书,此时必须将内网 CA 根证书追加到
openssl.cafile指向的 PEM 文件末尾
证书配置不对,换再快的镜像也照样失败;只换镜像不修证书,遇到其他 HTTPS 仓库(如私有 GitLab 包源)还会复现。










