Composer install 报 SSL certificate problem 的根本原因是 PHP/cURL 缺失可信 CA 证书,推荐方案是配置 openssl.cafile 和 curl.cainfo 指向正确的 PEM 格式证书文件;临时绕过仅限开发环境,如 composer config -g secure-http false 或 --no-secure-http。

Composer install 时提示 SSL certificate problem 怎么办
这是 Composer 在请求 https://packagist.org 或私有仓库时,PHP cURL 扩展无法验证 HTTPS 证书导致的报错,典型错误信息形如:
SSL certificate problem: unable to get local issuer certificate或
curl error 60: SSL certificate problem: self signed certificate in certificate chain。本质不是 Composer 本身问题,而是 PHP 的 OpenSSL 配置缺失或不匹配。
临时关闭 SSL 验证(仅限开发环境)
最直接的绕过方式是让 Composer 忽略证书校验,但切勿在 CI/CD 或生产服务器上使用。执行以下命令之一:
- 全局禁用(影响所有后续命令):
composer config -g secure-http false
- 单次禁用(只对当前命令生效):
composer install --no-secure-http
- 通过环境变量(适合脚本中临时控制):
COMPOSER_NO_SECURE_HTTP=1 composer install
注意:secure-http 是 Composer 1.7+ 引入的配置项,它不仅控制 HTTPS 请求,还强制要求包仓库必须用 HTTPS 协议。设为 false 后,HTTP 仓库也能被接受,安全风险明显上升。
正确配置 CA 证书路径(推荐长期方案)
根本解法是让 PHP/cURL 知道去哪里找可信根证书。关键在于两个配置点:
-
openssl.cafile(PHP ini 中):指定 PEM 格式证书文件路径,优先级高于curl.cainfo -
curl.cainfo(PHP ini 中):cURL 模块专用的 CA 文件路径
操作步骤:
- 下载最新 Mozilla CA 包:
curl -o /usr/local/etc/php/ca-bundle.crt https://curl.se/ca/cacert.pem
(Linux/macOS)或手动保存到 Windows 路径如C:\php\cacert.pem - 编辑
php.ini,添加或修改两行:openssl.cafile=/usr/local/etc/php/ca-bundle.crt curl.cainfo=/usr/local/etc/php/ca-bundle.crt
- 重启 Web 服务或 CLI PHP 进程,验证是否生效:
php -r "print_r(openssl_get_cert_locations());"
输出中default_cert_file应指向你设置的路径
若使用 Docker,记得把证书文件 COPY 进镜像,并在 php.ini 中正确挂载路径;WAMP/XAMPP 用户常忽略 php.ini 实际加载的是 Apache 还是 CLI 版本,需分别检查。
私有 Packagist 仓库自签名证书怎么处理
企业内部搭建的 Satis/SatisPress 或 Private Packagist,若用自签名证书,不能简单关 SSL,否则 Composer 会拒绝连接。可行做法有:
- 将私有 CA 证书追加进系统信任库(Linux:
cp your-ca.crt /usr/local/share/ca-certificates/ && update-ca-certificates) - 在 Composer 配置中为该仓库单独指定证书:
composer config repos.my-private-repo composer https://repo.example.com composer config repos.my-private-repo options.ssl.certificate-authority /path/to/your-ca.crt
- 使用
composer config --global cafile /path/to/your-ca.crt全局指定(Composer 2.2+ 支持)
注意:options.ssl.certificate-authority 只作用于该仓库,不影响 packagist.org;而 cafile 是全局覆盖行为,优先级高于 curl.cainfo。
证书链不完整、中间证书缺失、PHP 版本太旧(如 PHP 5.6 默认无内置 CA)、Docker 容器里没装 ca-certificates 包——这些才是高频真实原因,比盲目关 SSL 更值得排查。










