cURL error 60 或 SSL3_GET_SERVER_CERTIFICATE 错误本质是证书验证失败,主因是PHP找不到可信CA根证书或系统时间偏差超±5分钟;需检查openssl_get_cert_locations()返回路径的文件是否存在可读,及date校准时间,而非调整超时配置。

curl error 60 或 SSL3_GET_SERVER_CERTIFICATE 是证书问题,不是超时配置能解决的
看到 SSL3_GET_SERVER_CERTIFICATE、SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 或 curl error 60,说明 Composer 已成功发起 HTTPS 请求,但卡在 TLS 握手后的证书校验环节——此时调 http.timeout 或 process-timeout 完全无效。
根本原因只有两个:PHP 找不到可信 CA 根证书,或系统时间严重偏差(±5 分钟以上)导致证书“未生效”或“已过期”。
- 运行
php -r "print_r(openssl_get_cert_locations());"查看 PHP 实际加载的default_cert_file路径 - 用
ls -l检查该路径文件是否存在、是否可读;常见失效路径如/etc/ssl/cert.pem(macOS Monterey+ 后常为空)、/etc/pki/tls/cert.pem(某些 CentOS 镜像里是空文件) - 用
date确认系统时间是否准确;虚拟机、Docker 容器、WSL2 常因时钟不同步触发此错
macOS 和 Linux 下快速修复 cafile 路径错配
Homebrew 安装的 PHP 或 curl 通常自带最新证书,但 PHP 默认不自动使用它。必须显式告诉 Composer 哪个证书文件可用。
- 先安装证书包:
brew install ca-certificates(macOS)或apt-get install ca-certificates(Debian/Ubuntu) - 查证书实际位置:
brew --prefix ca-certificates→ 得到类似/opt/homebrew/share/ca-certificates,再拼出完整路径如/opt/homebrew/share/ca-certificates/cacert.pem - 强制 Composer 使用它:
composer config --global cafile /opt/homebrew/share/ca-certificates/cacert.pem - 验证是否生效:删掉
vendor目录后跑一次composer install -v,看日志里是否不再报 SSL 错误,且开始正常下载
Windows 上证书失效的典型表现与绕过方式
Windows 用户遇到此错,90% 是因为 PHP 使用了旧版 OpenSSL(如 PHP 8.0 自带的),其内置证书库早已过期,又没配置外部 cafile。
- 别改
php.ini里的openssl.cafile—— Composer 不读这个,只认自己的cafile配置项 - 手动下载最新 cacert.pem:
curl -o %USERPROFILE%\cacert.pem https://curl.se/ca/cacert.pem - 设置全局 cafile:
composer config --global cafile %USERPROFILE%\cacert.pem - 若仍失败,临时禁用证书验证(仅调试用):
set COMPOSER_DISABLE_TLS=1(Windows)或export COMPOSER_DISABLE_TLS=1(Linux/macOS),但切勿在 CI 或生产环境用
为什么 composer diagnose 查不出证书问题
composer diagnose 只检测基础网络连通性和 JSON 语法,它会跳过 HTTPS 证书校验,直接用 file_get_contents() 尝试读取 https://packagist.org/packages.json 的 HTTP 状态码——这一步可能成功,但后续真正下载 ZIP 包或访问 GitHub API 时才会触发完整 TLS 握手和证书链校验。
所以即使 diagnose 显示 “OK”,只要出现 SSL3_GET_SERVER_CERTIFICATE 或下载中途中断,就必须按证书路径排查。最容易被忽略的是:证书文件存在,但权限为 000 或属主不对(如 root 写入、普通用户无读权),PHP 进程静默失败,不报错也不提示。


















