composer config github-protocols 是 composer 控制依赖克隆时 github 协议的配置项,默认为 ["https"];设为 ["ssh"] 可强制走 ssh,但需确保 ssh 密钥、代理及网络端口(22 或 443)正常。

composer config github-protocols 是什么
这是 Composer 用来指定访问 GitHub 仓库时默认协议的配置项,控制 composer install 或 composer update 过程中 Git 克隆依赖所用的 URL 方式。它不改变你本地 Git 的全局设置,只影响 Composer 自己生成的仓库地址(比如从 packagist.org 解析出的 github.com/user/repo)。
默认值是 ["https"],意味着即使你本地 SSH 密钥已配好,Composer 仍会走 HTTPS,导致无法拉取私有仓库或频繁输密码。
怎么让 composer 优先用 SSH 协议
执行这条命令即可:
composer config -g github-protocols '["ssh"]'
注意几个关键点:
-
-g表示全局配置(写入~/.composer/config.json),所有项目都生效;如只对当前项目生效,去掉-g - 值必须是 JSON 数组格式,字符串要用双引号,
["ssh"]和["https","ssh"]都合法,但顺序无关——Composer 实际只尝试第一个协议失败后才换下一个 - 如果设成
["ssh"],而某包在 packagist 上注册的是 HTTPS 地址(比如https://github.com/symfony/console),Composer 会自动替换成 SSH 格式:git@github.com:symfony/console.git
为什么配了 SSH 还报 “Permission denied (publickey)”
这不是 Composer 配置的问题,而是 SSH 认证链没打通。常见断点:
-
ssh -T git@github.com命令返回失败,说明密钥没加到 ssh-agent 或没上传到 GitHub - 用了非默认密钥名(比如
id_rsa_github),但没在~/.ssh/config里声明 Host 别名和 IdentityFile - GitHub 账户绑的是邮箱 A,但本地
git config --global user.email是邮箱 B —— 这不影响克隆,但容易混淆排查方向 - 公司网络拦截了 SSH 端口(22),此时强行设
["ssh"]会导致所有依赖安装卡住或报错,得 fallback 到["https"]或配 SSH over HTTPS(见下条)
HTTPS 代理环境或防火墙下怎么安全用 GitHub
如果 22 端口不通,又不想走明文 HTTPS(比如要避免 token 泄露或绕过 Basic Auth 限制),可以启用 GitHub 的 SSH over HTTPS:
- 在
~/.ssh/config加一段:
Host github.com HostName ssh.github.com Port 443 User git
然后保持 composer config -g github-protocols '["ssh"]' 不变。Composer 生成的 git@github.com:user/repo.git 会被系统自动映射到 ssh.github.com:443,走 TLS 隧道完成 SSH 认证。
这个方案既保了密钥认证,又绕过了企业防火墙对 22 端口的封锁,但前提是你的 SSH 客户端支持这种跳转(OpenSSH 7.2+ 默认支持)。
真正麻烦的不是配哪条命令,而是搞清你现在卡在哪一层:是 Composer 没发 SSH 请求,还是请求发出去了但连不上,还是连上了却鉴权失败。每层对应不同的日志和验证方式,别一上来就改 config.json。










