Composer install/update 卡在 TLS handshake timeout 是因底层 cURL 或 OpenSSL 版本过低无法完成 TLS 1.2+ 握手,常见于国内访问 packagist.org 或旧镜像源;需检查 php -i 输出的 cURL 和 OpenSSL 版本,确保 cURL ≥ 7.52.1 且 OpenSSL ≥ 1.0.2,并通过配置镜像源与强制 TLSv1.2 解决。

Composer install/update 卡在 TLS handshake timeout 是什么问题
这不是网络不通,而是 Composer 在建立 HTTPS 连接时,底层 cURL 或 OpenSSL 无法在默认时限内完成 TLS 握手——常见于国内访问 packagist.org 官方源,或某些镜像源(如阿里云、腾讯云旧镜像)启用了较新的 TLS 版本但本地 PHP/cURL 不兼容。
检查当前 PHP 的 cURL 和 OpenSSL 支持版本
先确认是不是底层能力缺失,而不是单纯换镜像就能解决:
- 运行
php -i | grep -E 'cURL|OpenSSL',重点看cURL version和OpenSSL/SSL version - PHP 7.2+ 且 cURL ≥ 7.52.1、OpenSSL ≥ 1.0.2 才能稳定支持 TLS 1.2+;若显示
OpenSSL 1.0.1e或更低,基本注定握手失败 - Windows 用户特别注意:PHP 自带的
libeay32.dll和ssleay32.dll可能过旧,即使系统 OpenSSL 新也没用
临时绕过 TLS 验证(仅调试用,不推荐长期启用)
不是“关 SSL”,而是让 Composer 忽略证书校验和握手超时限制——仅用于定位是否纯属 TLS 层问题:
- 加参数运行:
composer install --no-plugins --no-scripts -vvv观察最后一行卡在哪(通常是https://packagist.org/packages.json) - 临时禁用验证:
composer config -g secure-http false,再加超时延长:composer config -g github-protocols https - 更激进方式(仅限本地调试):
export COMPOSER_NO_SSL=1(Linux/macOS)或set COMPOSER_NO_SSL=1(Windows),然后重试 - ⚠️ 注意:
secure-http=false会让 Composer 允许通过 HTTP 拉取包元数据,存在中间人风险,切勿在 CI 或生产环境使用
换镜像源 + 强制指定 TLS 版本(稳定方案)
国内主流镜像已升级 TLS 1.2/1.3,但部分仍默认协商旧协议;需主动约束协议版本:
- 推荐镜像(实测 TLS 兼容性好):
https://mirrors.aliyun.com/composer/(阿里云)、https://packagist.phpcomposer.com(已停用,别用) - 设置镜像并锁定 TLS 版本:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 关键一步:编辑
~/.composer/config.json(或%APPDATA%\Composer\config.json),在config节点下加:"options": { "ssl": { "verify_peer": true, "crypto_method": 30 // STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT(PHP 7.1.0+) } } - 如果 PHP 24(TLSv1.0)或升级 PHP;
crypto_method值错会导致直接报错Invalid crypto method
真正卡住的往往不是域名解析或下载慢,而是握手阶段无声挂起。盯住 -vvv 输出里 “Resolving dependencies through SAT” 之前那条 HTTPS 请求日志,那里才是问题起点。


















