
Composer install 时提示 SSL certificate problem 怎么办
这是 Composer 在请求 HTTPS 包源(如 packagist.org)时,系统无法验证服务器证书导致的报错,常见错误信息是:cURL error 60: SSL certificate problem: unable to get local issuer certificate。根本原因不是 Composer 本身有问题,而是 PHP 的 cURL 扩展没找到可信 CA 证书路径,或系统证书库过旧。
最稳妥的做法是配置正确的 CA 证书路径,而不是直接关掉 SSL 验证——后者会带来真实的安全风险,且在团队协作或 CI 环境中极易引发不可控问题。
- 检查当前 PHP 使用的 CA 路径:
php -r "print_r(openssl_get_cert_locations());",重点关注default_cert_file - 如果该路径为空、不存在,或指向一个过期/损坏的
ca-bundle.crt,就需要手动指定 - 下载最新 Mozilla CA 包(如从 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251),保存为本地文件(例如
/path/to/cacert.pem) - 在
php.ini中设置:openssl.cafile=/path/to/cacert.pem,然后重启 PHP(CLI 或 Web SAPI)
composer config -g secure-http false 为什么不能乱用
这个命令会全局关闭 Composer 对所有仓库的 HTTPS 强制要求,让 http:// 协议也能被接受。它不解决 SSL 报错,只是绕过验证逻辑——相当于把锁拆了,而不是修钥匙。
实际场景中,它只适用于极少数离线开发环境(比如完全内网、自建 HTTP 包源且无 TLS 能力),但一旦项目涉及任何公网依赖,就可能拉到被篡改的包。
-
secure-http是 Composer 2.0+ 默认开启的安全策略,禁用后composer install可能静默降级到 HTTP 源,你根本不会察觉 - 某些私有仓库(如 Nexus、Artifactory)支持 HTTPS 但配置错误,此时应修复证书,而非关 secure-http
- CI 流水线里执行这条命令等于给整个构建链路开后门,审计时会被直接否决
临时跳过 SSL 验证的唯一安全边界:仅限本地调试
如果你确认环境干净、不涉及敏感依赖、且只是临时跑通一个 demo,可以用 -n + --no-verify 组合绕过,但必须明确知道它只影响当次命令,不会写入配置。
注意:不是所有版本都支持 --no-verify;Composer 2.2+ 才正式引入该 flag,旧版只能靠环境变量临时覆盖。
- 正确写法(Composer ≥ 2.2):
composer install --no-verify - 兼容旧版写法:
COMPOSER_DISABLE_TLS=1 composer install(等价于禁用 TLS,比关证书验证更粗暴) - 这两者都不会修改全局或项目配置,执行完即失效,适合单次调试
- 切勿在脚本、Makefile 或 CI 配置里固化这类写法
Windows 上 php.ini 不生效?重点查 certinfo 和 openssl.cafile
Windows 用户常遇到改了 php.ini 但 Composer 依然报 SSL 错误,大概率是因为 PHP CLI 和 Web SAPI 加载的是不同 ini 文件,或者 openssl.cafile 被其他配置项覆盖。
关键动作不是猜路径,而是实锤当前生效的配置:
- 运行
php --ini确认 CLI 加载的是哪个php.ini - 运行
php -m | findstr openssl确保 openssl 扩展已启用 - 运行
php -r "var_dump(openssl_get_cert_locations());",看输出里default_cert_file是否是你设的路径,以及该文件是否存在、可读 - 如果
default_cert_file显示为空,说明openssl.cafile没生效,检查 ini 文件里是否有拼写错误(比如写成open_ssl.cafile)或被php_admin_value覆盖
真正卡住人的地方,往往不是找不到解决方案,而是分不清「证书路径未配置」和「证书路径配置了但文件不可读」——前者改配置就行,后者得查文件权限、路径斜杠方向、甚至杀毒软件拦截。动手前先跑一遍 openssl_get_cert_locations(),比盲目搜教程快得多。










