应将私有ca证书添加到信任链,配置curl.cainfo指向该证书文件,而非禁用tls或设secure-http=false,以安全解决ssl证书问题。

composer install 时提示 SSL certificate problem 怎么办
这是典型的 TLS 验证失败,不是 Composer 本身报错,而是它底层用的 cURL 或 OpenSSL 拒绝了不安全的证书链。生产环境绝不能关,但本地测试或内网私有源确实可能遇到自签名证书、过期证书或中间 CA 缺失。
- 临时绕过:在命令行加
-n(即--no-plugins)没用,真正起作用的是COMPOSER_DISABLE_TLS=1环境变量 - 更稳妥的临时方案是改配置:
composer config -g secure-http false,这会把全局config.json里的secure-http设为false - 注意:这个设置只影响 HTTP/HTTPS 协议判断,不等于禁用 TLS;它只是允许 Composer 访问
http://源——而你真正需要的是信任某个 HTTPS 源,所以它治标不治本
为什么 secure-http=false 不能解决自签名 HTTPS 报错
因为 secure-http 控制的是「是否允许非 HTTPS 的仓库地址」,和 TLS 握手验证完全无关。你访问的是 https://my-internal-repo.local,但证书无效,错误来自 PHP 的 stream context 或 cURL,Composer 自己不处理证书校验逻辑。
- 真实报错通常是:
cURL error 60: SSL certificate problem: self signed certificate或类似Peer's Certificate issuer is not recognized - PHP 层面要生效,得让
openssl.cafile或curl.cainfo指向一个包含你私有 CA 的 PEM 文件 - Composer 不读取
php.ini里所有配置,但它依赖 PHP 的 stream wrappers,所以改curl.cainfo是最直接的方式
如何让 Composer 信任自签名证书(推荐做法)
不是关验证,而是把你的根证书加进信任链。比设 secure-http=false 安全得多,也符合 Composer 本身的设计逻辑。
- 把你的 CA 证书(比如
my-ca.crt)转成 PEM 格式(如果还不是),合并到系统默认 CA 包或单独存一个路径,例如/usr/local/share/ca-certificates/my-ca.crt - 运行
update-ca-certificates(Linux)或手动配置 PHP:curl.cainfo = "/path/to/my-ca.crt"(写进php.ini) - 验证是否生效:执行
php -r "print_r(stream_context_get_options(stream_context_create(['http' => []])));",看cafile是否已加载 - Windows 用户注意:PHP for Windows 默认不读系统证书库,必须显式配
curl.cainfo
COMPOSER_DISABLE_TLS=1 的实际效果和风险
这个环境变量会让 Composer 完全跳过 HTTPS 协议层的加密检查,等价于强制用 HTTP 请求所有 https:// 地址——也就是把 TLS 连接降级成明文 HTTP。
- 它不会修改证书验证逻辑,而是让 Composer 构造请求时直接把 URL 的
https://替换成http:// - 如果你的私有仓库只监听 HTTPS(比如 Nginx 强制 301 跳转),那这个设置会导致 404 或重定向失败
- 它对
composer validate、composer show等命令都生效,且无法按仓库粒度控制 - CI/CD 中误用此变量,等于把整个依赖拉取过程暴露在中间人攻击下
真要压测或离线调试,不如用 composer install --no-plugins --no-scripts 配合本地 path 仓库,比硬关 TLS 更可控。










