答案是本地ca证书过期或缺失导致https握手失败,需修复证书链而非禁用验证:windows用户配置php.ini中curl.cainfo指向最新cacert.pem并重启环境;macos用brew更新openssl和ca-certificates;linux重装ca-certificates包;同时检查并切换已停服的镜像源。

Composer install/update 报 cURL error 60 或 SSL certificate problem
这是典型的本地 CA 证书过期或缺失导致的 HTTPS 握手失败。Composer 默认走 HTTPS 访问 packagist.org 或国内镜像(如 https://packagist.phpcomposer.com),一旦系统或 PHP 的 OpenSSL 信任库陈旧,就会卡在 SSL 验证环节。
不要直接关掉 SSL 验证(比如设 secure-http=false),那等于把 Composer 暴露在中间人攻击风险下。优先修复证书链:
- Windows 用户:升级到最新版
Composer-Setup.exe(自带更新后的 CA 包);或手动下载 cacert.pem,然后在php.ini中设置curl.cainfo = "C:\path\to\cacert.pem",再重启 Web 服务或 CLI 环境 - macOS(Homebrew PHP):运行
brew update && brew upgrade openssl php,确保openssl version -d输出路径下的cert.pem是有效的;必要时用brew reinstall ca-certificates - Linux(Debian/Ubuntu):执行
sudo apt update && sudo apt install --reinstall ca-certificates,再确认/etc/ssl/certs/ca-certificates.crt时间戳较新
国内镜像站返回 502/503 或连接超时,但官网能通
说明问题不在本地证书,而是镜像本身不可用或 DNS 解析异常。常见于老镜像域名(如 packagist.phpcomposer.com)已停服,或 DNS 缓存了错误 IP。
检查当前配置是否还在用已失效镜像:
- 运行
composer config -g repo.packagist,若输出是{"type": "composer", "url": "https://packagist.phpcomposer.com"},说明配置已过时 - 立即切换至仍在维护的镜像,例如阿里云:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 清华镜像需注意:自 2024 年起仅支持 HTTPS,且要求 UA 包含
Composer字样,旧版 Composer(composer self-update
升级 Composer 后仍报 SSL 错误,但 curl -I https://packagist.org 正常
说明系统级 curl 可用,但 PHP 内置的 cURL 扩展没读到相同证书路径。PHP 和命令行 curl 使用的是两套 CA 配置。
验证并统一证书源:
- 查 PHP 的 cURL 默认 CA 路径:
php -r "print_r(curl_version());",看ssl_version和features是否含CURL_VERSION_SSL;再运行php -r "print_r(openssl_get_cert_locations());",重点关注default_cert_file - 如果该路径为空或指向不存在文件,手动指定:在
php.ini加一行openssl.cafile=/etc/ssl/certs/ca-certificates.crt(Linux/macOS)或对应 Windows 路径 - 改完后必须重启 PHP-FPM、Apache 或终端新启一个 shell,否则 CLI 下的
composer不会生效
临时绕过但不推荐的操作:禁用 SSL 验证
仅限调试或离线环境测试,生产环境绝对禁止。操作后所有包下载将失去完整性校验:
- 全局关闭(高危):
composer config -g secure-http false—— 这会让 Composer 允许 HTTP 协议源,极易被劫持 - 单次跳过(稍好一点):
composer install --no-secure-http,但只对当前命令生效,且不解决根本问题 - 更隐蔽的风险点:某些公司代理或杀毒软件会注入自签名根证书,导致 PHP 的 OpenSSL 无法识别其签发的证书;此时需把该代理证书导出为 PEM,追加进
openssl.cafile指向的文件末尾
证书问题本质是信任链断裂,不是网络不通。修证书路径、换镜像、升 Composer 版本,三者通常组合使用才真正见效。最容易被忽略的是 PHP 和系统 curl 的 CA 文件不一致,以及改完 php.ini 没重启进程。











