如何解决Composer提示SSL连接重置问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计881个文字,预计阅读时间需要4分钟。
这不是网络不通,也不是墙的问题,而是+TLS握手被中间设备(如企业代理、旧版OpenSSL或防火墙)强行中断。直接开启HTTPS或更换协议只是绕开症状,并非修复。
curl error 35 是什么信号
cURL error 35 出现在 composer diagnose 或 composer install 过程中,说明 OpenSSL 协议协商失败——客户端和 packagist.org 在 TLS 握手阶段就断开了,连证书校验那步都没走到。
- 常见于 RHEL/CentOS 7(OpenSSL 1.0.2k)、Windows 上 XAMPP/MAMP 自带的老旧 PHP、或企业内网代理重签证书的环境
- 不是证书过期(那是
cURL error 60),所以改curl.cainfo不会起作用 - 运行
openssl version,若低于OpenSSL 1.1.1,基本可以确定是版本不支持 TLS 1.3 导致握手失败 - 临时验证:加环境变量
CURL_IPRESOLVE=4 composer install(强制 IPv4)能跑通,说明是 IPv6 路由或中间设备干扰问题
为什么 config -g secure-http false 不解决问题
设 composer config -g secure-http false 后,Composer 会把所有源降级为 HTTP,但 packagist.org 已强制重定向到 HTTPS,最终仍会触发 TLS 握手——错误照旧,只是报错位置可能变成 301 或 connection reset。
- 这个配置只影响 Composer 自己解析
repositories的行为,不改变底层 cURL 的 TLS 协商逻辑 - 它还会让私有源也走明文,存在依赖劫持风险,生产环境绝对不能留
- 真正该动的是 OpenSSL 层:升级系统 OpenSSL,或让 PHP 使用新版 OpenSSL 编译(如 Homebrew 安装的 php@8.3)
更换下载协议的实际操作边界
所谓“更换协议”,只有两个安全、可控的入口点:指定 CA 路径(针对 cURL error 60)或切换镜像源(针对连接稳定性),而不是关 TLS。
- 阿里云镜像
https://mirrors.aliyun.com/composer/用的是标准 TLS 1.2+,且 CDN 节点更靠近国内用户,握手成功率远高于直连 packagist.org - 执行
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/后,记得清缓存:composer clear-cache - 如果公司有私有仓库,必须单独配
cafile:composer config -g repos.my-company {"url": "https://repo.example.com", "type": "composer", "options": {"ssl": {"cafile": "/path/to/internal-ca.pem"}}} - 不要用
http://镜像源——目前主流镜像都不提供 HTTP 接口,强行配会 403 或跳转失败
最容易被忽略的点:PHP 实例不统一
你敲 composer install 和 php composer.phar install 可能走的是完全不同的 PHP 环境,导致一个成功一个失败。
- 查清楚当前命令背后是哪个 PHP:
which php和php -i | grep 'Loaded Configuration File' - CLI 和 Web 服务器(如 Apache/Nginx)的
php.ini常常不同,openssl.cafile和curl.cainfo必须在两者中都正确设置 - Windows 下尤其注意路径分隔符:php.ini 里必须写
C:/php/extras/ssl/cacert.pem或C:\php\extras\ssl\cacert.pem,单反斜杠会失效
本文共计881个文字,预计阅读时间需要4分钟。
这不是网络不通,也不是墙的问题,而是+TLS握手被中间设备(如企业代理、旧版OpenSSL或防火墙)强行中断。直接开启HTTPS或更换协议只是绕开症状,并非修复。
curl error 35 是什么信号
cURL error 35 出现在 composer diagnose 或 composer install 过程中,说明 OpenSSL 协议协商失败——客户端和 packagist.org 在 TLS 握手阶段就断开了,连证书校验那步都没走到。
- 常见于 RHEL/CentOS 7(OpenSSL 1.0.2k)、Windows 上 XAMPP/MAMP 自带的老旧 PHP、或企业内网代理重签证书的环境
- 不是证书过期(那是
cURL error 60),所以改curl.cainfo不会起作用 - 运行
openssl version,若低于OpenSSL 1.1.1,基本可以确定是版本不支持 TLS 1.3 导致握手失败 - 临时验证:加环境变量
CURL_IPRESOLVE=4 composer install(强制 IPv4)能跑通,说明是 IPv6 路由或中间设备干扰问题
为什么 config -g secure-http false 不解决问题
设 composer config -g secure-http false 后,Composer 会把所有源降级为 HTTP,但 packagist.org 已强制重定向到 HTTPS,最终仍会触发 TLS 握手——错误照旧,只是报错位置可能变成 301 或 connection reset。
- 这个配置只影响 Composer 自己解析
repositories的行为,不改变底层 cURL 的 TLS 协商逻辑 - 它还会让私有源也走明文,存在依赖劫持风险,生产环境绝对不能留
- 真正该动的是 OpenSSL 层:升级系统 OpenSSL,或让 PHP 使用新版 OpenSSL 编译(如 Homebrew 安装的 php@8.3)
更换下载协议的实际操作边界
所谓“更换协议”,只有两个安全、可控的入口点:指定 CA 路径(针对 cURL error 60)或切换镜像源(针对连接稳定性),而不是关 TLS。
- 阿里云镜像
https://mirrors.aliyun.com/composer/用的是标准 TLS 1.2+,且 CDN 节点更靠近国内用户,握手成功率远高于直连 packagist.org - 执行
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/后,记得清缓存:composer clear-cache - 如果公司有私有仓库,必须单独配
cafile:composer config -g repos.my-company {"url": "https://repo.example.com", "type": "composer", "options": {"ssl": {"cafile": "/path/to/internal-ca.pem"}}} - 不要用
http://镜像源——目前主流镜像都不提供 HTTP 接口,强行配会 403 或跳转失败
最容易被忽略的点:PHP 实例不统一
你敲 composer install 和 php composer.phar install 可能走的是完全不同的 PHP 环境,导致一个成功一个失败。
- 查清楚当前命令背后是哪个 PHP:
which php和php -i | grep 'Loaded Configuration File' - CLI 和 Web 服务器(如 Apache/Nginx)的
php.ini常常不同,openssl.cafile和curl.cainfo必须在两者中都正确设置 - Windows 下尤其注意路径分隔符:php.ini 里必须写
C:/php/extras/ssl/cacert.pem或C:\php\extras\ssl\cacert.pem,单反斜杠会失效

