应配置可信CA证书路径而非禁用SSL验证:下载Mozilla CA bundle并用composer config -g cafile指定路径,公司内网需追加内部CA证书至bundle,Docker中需显式COPY证书并重新配置。

composer install 报 “SSL certificate problem” 怎么办
直接原因是 OpenSSL 无法验证 HTTPS 连接的证书链,常见于公司代理、老旧 CA 证书、或自建镜像源未配全中间证书。不是 Composer 本身的问题,但会卡在 composer install 或 composer update 的第一步。
临时绕过最简单:运行前加环境变量,让 cURL 忽略证书校验:
export COMPOSER_CAFILE=/dev/null composer install
但注意:COMPOSER_CAFILE=/dev/null 是明确告诉 Composer “别用任何 CA 文件”,比 curl -k 更底层,也更可靠;而仅设 CURLOPT_SSL_VERIFYPEER=false(比如改 vendor/bin/composer)不生效,因为 Composer 不读这个。
为什么 set COMPOSER_DISABLE_TLS=true 不推荐
这个配置会让 Composer 强制降级走 HTTP,看似跳过 SSL,实则引入两个风险:
- 所有包元数据(
packages.json)明文传输,可被篡改,存在供应链投毒可能 - 某些仓库(如 packagist.org)已强制 HTTPS,设了该变量反而报
Connection refused或重定向失败
它只适合离线开发机+本地 HTTP 镜像这种完全可控场景,生产、CI、协作环境一律避免。
真正安全的长期解法:换 CA 证书路径
Composer 默认用系统 OpenSSL 的 CA 包,但 macOS(M1/M2)、Windows WSL、某些 Docker 镜像里常缺失或过期。正确做法是显式指定一个可信的 CA bundle:
- 下载最新 Mozilla CA bundle:
curl -sS https://curl.se/ca/cacert.pem -o /usr/local/etc/php/certs/cacert.pem - 告诉 Composer 用它:
composer config -g cafile /usr/local/etc/php/certs/cacert.pem - 验证是否生效:
composer diagnose应显示CA file: /usr/local/etc/php/certs/cacert.pem
路径不固定,关键是确保文件可读、且内容是 PEM 格式证书链;如果用 Homebrew 装的 PHP,常用路径是 /opt/homebrew/etc/php/<version>/conf.d/php.ini</version> 里配 openssl.cafile,但 Composer 优先读自己的 cafile 配置。
公司内网镜像源怎么配证书信任
如果你用的是私有 Packagist(如 Satis、Private Packagist),且用了自签名证书或内部 CA,不能跳过验证,必须把内部 CA 证书追加进 bundle:
- 拿到公司根证书(通常是
company-root.crt) - 把它追加到你正在用的 CA bundle 后面:
cat company-root.crt >> /usr/local/etc/php/certs/cacert.pem - 确认没重复、无乱码,再跑
composer clear-cache
漏掉这一步,即使设了 cafile,也会报 unable to get local issuer certificate —— 因为证书链断在内部 CA 这一级。
最易被忽略的是:Docker 构建时,宿主机的 cafile 配置不会自动带进容器,每次 docker build 都得 COPY 证书并重新 composer config -g cafile,否则 RUN composer install 仍走默认(失效)路径。










