Composer SSL证书验证失败本质是PHP cURL无法验证TLS证书链,主因是系统CA证书过旧、缺失或代理劫持;禁用校验风险极高,应优先更新系统CA包或配置Composer专用cafile路径。

Composer 在执行 composer install 或 composer update 时提示 SSL 证书验证失败(如 cURL error 60: SSL certificate problem),本质是 PHP 的 cURL 扩展无法验证远程 HTTPS 站点(主要是 packagist.org)的 TLS 证书链。这不是 Composer 自身 bug,而是系统 CA 证书过旧、缺失,或网络中间设备(如企业代理、防火墙)劫持了 TLS 连接。
为什么不能直接关 SSL 校验?
临时禁用证书校验(如设置 curl.cainfo 为空或加 --no-verify)看似快,但会带来严重风险:
- 所有 HTTPS 请求(包括下载包、访问私有仓库)跳过证书验证,可能被中间人窃取或篡改依赖包
- Composer 本身不提供全局
--no-verify参数;强行修改php.ini中的curl.cainfo为空值,会导致其他 PHP 项目也失效 - 多数现代 Linux 发行版和 macOS 已默认启用严格校验,绕过等于自降安全水位
优先检查并更新系统 CA 证书包
绝大多数情况,问题出在本地 CA 证书库陈旧或未正确加载。Composer 依赖 PHP 的 cURL,而 cURL 默认使用系统级 CA 包(如 /etc/ssl/certs/ca-certificates.crt 或 macOS 的 Keychain)。
按系统类型操作:
-
Ubuntu/Debian:
sudo apt update && sudo apt install --reinstall ca-certificates
-
CentOS/RHEL 8+:
sudo dnf reinstall ca-certificates
-
macOS(Homebrew):
brew reinstall ca-certificates
,然后确认 PHP 使用它:php -r "print_r(openssl_get_cert_locations());"
查看capath和default_cert_file路径是否指向 Homebrew 的证书目录(如/opt/homebrew/etc/openssl@3/cert.pem) -
Windows(WAMP/XAMPP):打开
php.ini,确认curl.cainfo指向一个真实存在的 PEM 文件,例如:curl.cainfo="C:\wamp64\bin\php\php8.2.12\extras\ssl\cacert.pem"
—— 若该文件不存在,需手动下载 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 并保存到对应路径
配置 Composer 使用指定 CA 文件(推荐长期方案)
不改系统或 PHP 全局配置,只让 Composer 自己用可信证书,最稳妥。Composer 支持通过环境变量或 config 设置 CA 路径:
- 查看当前配置:
composer config --global cafile
- 设置为系统证书路径(Linux/macOS 常见):
composer config --global cafile /etc/ssl/certs/ca-certificates.crt
- 若用 Homebrew OpenSSL:
composer config --global cafile /opt/homebrew/etc/openssl@3/cert.pem
- Windows 示例:
composer config --global cafile "C:\wamp64\bin\php\php8.2.12\extras\ssl\cacert.pem"
该设置写入 ~/.composer/config.json(或 %USERPROFILE%\AppData\Roaming\Composer\config.json),仅影响 Composer,不影响其他 PHP 应用。
企业内网或代理环境下的特殊处理
如果公司网络强制使用自签名代理证书(如 Zscaler、Blue Coat),系统 CA 里没有该根证书,就必须手动导入:
- 导出代理的根证书(通常浏览器可导出为
.crt或.pem) - 合并进 CA 文件(Linux/macOS):
cat your-proxy-root.crt >> /etc/ssl/certs/ca-certificates.crt
,再运行sudo update-ca-certificates - 或单独为 Composer 指定一个包含该证书的 PEM:
cat /etc/ssl/certs/ca-certificates.crt your-proxy-root.crt > ~/custom-cacert.pem
,然后composer config --global cafile ~/custom-cacert.pem
- 切勿设置
http_proxy或https_proxy环境变量后还强行关 SSL —— 代理本身应负责证书终止,Composer 只需信任代理的根证书
证书路径错误、权限不足(如文件不可读)、PEM 格式损坏(含 Windows 换行符或 BOM)是最常被忽略的细节,建议用 file ~/custom-cacert.pem 和 openssl x509 -in ~/custom-cacert.pem -text -noout 验证有效性。










