composer ssl证书问题根源是php或系统ca证书配置错误,应下载mozilla ca包并配置php.ini中openssl.cafile指向该文件,而非禁用验证。

Composer install/update 报 SSL certificate problem 怎么办
直接关 SSL 验证不是解法,是掩耳盗铃。真实问题是 Composer 默认启用 CA 证书校验,但系统没配好或证书过期——尤其在 Docker、CI 环境、老旧 Linux 发行版(如 CentOS 7)或公司内网代理后更常见。
实操建议:
- 先运行
openssl version -d查看 OpenSSL 默认证书目录,再确认该路径下是否存在cert.pem或ca-bundle.crt - 用
curl -v https://repo.packagist.org/packages.json测试底层 HTTPS 是否通,能快速区分是 Composer 层问题还是系统级 SSL 失效 - 别改
composer.json的secure-http字段来绕过——它只控制源站是否强制 HTTPS,不解决证书验证失败
怎么让 Composer 用对的 CA 证书
Composer 本身不自带根证书,它依赖 PHP 的 openssl.cafile 或系统 OpenSSL 配置。PHP 启动时若没指定证书路径,就会 fallback 到空或错误位置。
实操建议:
- 下载最新 Mozilla CA 包:用
curl -sS https://curl.se/ca/cacert.pem -o /usr/local/etc/php/conf.d/cacert.pem(路径按实际 PHP 配置调整) - 在
php.ini中显式设置:openssl.cafile=/usr/local/etc/php/conf.d/cacert.pem - 验证是否生效:运行
php -r "print_r(openssl_get_cert_locations());",检查default_cert_file是否指向你刚放的文件 - 如果用的是 Docker,记得把证书文件 COPY 进镜像,并在
php.ini中挂载或覆盖对应配置
公司内网或代理环境下 Composer 走 HTTPS 失败
不是所有代理都支持 TLS 中间人解密,有些会替换证书但没把自签 CA 推送到客户端信任链,导致 PHP 层面报 unable to get local issuer certificate。
实操建议:
- 向 IT 部门索要内网代理的根证书(通常是
.crt文件),合并到你的 CA 包里:cat internal-ca.crt >> /path/to/cacert.pem - 避免用
http://替代https://源——Packagist 已全站强制 HTTPS,composer config -g repo.packagist composer https://packagist.org是无效操作 - 如果必须走 HTTP 代理,确保代理服务本身支持 CONNECT 方法,并在环境变量中设:
export HTTPS_PROXY=http://your-proxy:8080(注意是HTTPS_PROXY,不是HTTP_PROXY)
为什么 composer config -g secure-http false 不起作用
这个命令只是告诉 Composer 允许添加非 HTTPS 的仓库源,跟 SSL 握手失败完全无关。它不碰证书验证逻辑,也不影响 curl 或 stream_context 的底层行为。
常见误解点:
-
secure-http是仓库策略开关,不是 TLS 开关 -
composer diagnose里提示 “You are running Composer with SSL support” 并不代表证书可用,只说明扩展已加载 - 某些 IDE 内置终端或 Git Bash 可能使用 MinGW 版 OpenSSL,证书路径和 Windows 原生不同,需单独配置
真正卡住的地方,往往在 PHP 的 openssl.cafile 路径没对上,或者证书文件权限不对(比如 root 写、www-data 读不了)。查的时候别只盯着 Composer 配置。









