Composer install 在无 SSH 权限时失败,因默认用 SSH 克隆私有仓库却缺少密钥;应改用 HTTPS+Token,并通过 auth.json 配置凭据、git config --global url..insteadOf 替换域名,同时确保文件权限为600且配置对运行用户生效。

为什么 composer install 在无 SSH 权限时会失败?
因为 Composer 默认尝试用 SSH 协议克隆私有 Git 仓库(如 git@github.com:org/repo.git),而服务器没有 SSH key 或 ssh-agent,git clone 直接报错:Permission denied (publickey)。此时必须强制改用 HTTPS + 认证方式,且不能依赖交互式输入密码。
如何用 GitHub/GitLab Token 替换 SSH URL 并全局生效?
关键是在 composer.json 中把私有包的 repository 地址从 SSH 改为 HTTPS,并注入 Token;同时配置 Git 让它对目标域名自动带上凭据,避免 Composer 调用 git 时卡住。
- 修改
composer.json中的repositories:将"url": "git@github.com:org/private-package.git"换成"url": "https://YOUR_TOKEN@github.com/org/private-package.git" - 运行命令让 Git 记住凭据(避免每次 clone 都提示):
git config --global url."https://
YOUR_TOKEN@github.com/".insteadOf "https://github.com/" - GitLab 同理,把域名换成
gitlab.com或你的自建地址
auth.json 和环境变量哪种方式更安全可靠?
优先用 auth.json(项目级),它比环境变量更稳定、不依赖 shell 初始化,也避免 Token 泄露到进程列表。但注意路径和权限:
-
auth.json必须放在项目根目录或COMPOSER_HOME下(默认~/.composer/auth.json) - 内容格式严格:
{ "http-basic": { "github.com": { "username": "YOUR_TOKEN", "password": "" } } } - 文件权限设为
600(chmod 600 auth.json),否则 Composer 会拒绝读取 - Token 类型:GitHub 用
classic token(勾选reposcope),GitLab 用Personal Access Token(read_repository)
HTTPS 克隆失败的常见报错与绕过技巧
即使配了 Token,仍可能遇到 Could not fetch https://.../info/refs?service=git-upload-pack 或 SSL 证书错误——这通常不是认证问题,而是网络或 Git 配置导致:
- 确认 Git 版本 ≥ 2.9(旧版不支持
insteadOf凭据注入):git --version - 禁用 SSL 验证(仅调试用,生产禁用):
git config --global http.sslVerify false
- 如果服务器 DNS 不通 GitHub,可临时加 hosts:
140.82.112.4 github.com - Composer v2+ 默认启用
secure-http,若私有 Git 服务用自签名 HTTPS,需在composer.json加:"config": { "secure-http": false }
auth.json 文件权限和 Git 的 insteadOf 配置是否对当前运行 Composer 的用户生效——尤其是用 www-data 或容器非 root 用户执行时,--global 配置可能没加载。










