Composer SSL connection reset 或 cURL error 35 是 OpenSSL 协议协商失败所致,根源在于 TLS 握手被中间设备中断;需优先通过 composer diagnose 确认错误,检查 OpenSSL 版本、配置可信 CA 路径(composer config -g cafile),或在 Windows 下配置 curl.cainfo 指向有效 PEM 证书。

Composer install 时提示 SSL connection reset 或 cURL error 35
这是 OpenSSL 协议协商失败的典型表现,不是网络不通,而是客户端和 Packagist 服务器在 TLS 握手阶段被中间设备(比如公司代理、防火墙、旧版 OpenSSL)强行中断。直接换镜像源或关 HTTPS 并不能根治——很多企业环境会拦截并重签证书,导致 Composer 的默认 CA 校验失败。
- 先确认是否真由 SSL 引起:
composer diagnose会明确报出curl error 35或SSL connect error - 不要盲目执行
composer config -g secure-http false,这会让所有包下载走 HTTP,存在依赖劫持风险 - 优先检查系统级 OpenSSL 版本:
openssl version。低于OpenSSL 1.1.1的版本(尤其是 RHEL/CentOS 7 自带的 1.0.2k)无法正确协商 TLS 1.3,而 Packagist 已逐步强制要求
用 composer config 设置可信 CA 证书路径
Composer 默认使用 PHP 内置的 CA 包(通常来自 cURL + OpenSSL),但企业代理常替换为私有根证书,PHP 不会自动信任。你需要显式告诉它用哪个证书文件。
- 找到你的私有 CA 证书(通常是
.pem或.crt文件),比如/etc/pki/ca-trust/source/anchors/company-root.crt - 执行:
composer config -g cafile /path/to/company-root.crt - 验证是否生效:运行
composer diagnose,输出中应显示CA file: /path/to/company-root.crt - 注意:该配置只影响当前用户,
-g是全局配置;若多用户共用环境,需确保路径可读且证书格式为 PEM(不能是 DER)
临时绕过证书校验(仅限调试)
生产环境绝对禁止,但排查时可以快速验证是否纯属证书问题。这不是“解决方案”,只是诊断开关。
- 加参数跳过校验:
composer install --no-ssl(等价于--prefer-source+ 关闭 HTTPS) - 或临时禁用安全限制:
COMPOSER_NO_SSL=1 composer install - 如果此时成功,说明 100% 是证书链或 TLS 协议问题,不是网络策略封端口
- 切记:执行完立刻删掉
COMPOSER_NO_SSL环境变量,否则后续所有命令都走明文
Windows 上 PHP+cURL 使用系统证书失败的处理
Windows 下 PHP 常用的线程安全(TS)版本不自带 CA 包,且不会读取 Windows 证书存储,cURL 默认找不到可信根证书。
- 下载 Mozilla 维护的最新 CA 包:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,保存为
C:\php\cacert.pem - 在
php.ini中添加:curl.cainfo = "C:\php\cacert.pem",然后重启 Web 服务或 CLI - 验证:
php -r "print_r(curl_version());"查看ssl_version和features是否含CURL_VERSION_SSL - 如果仍失败,检查 PHP 是否加载了
php_curl.dll和php_openssl.dll,缺一不可
musl 而非 glibc,CA 行为完全不同。










