composer连不上github主因是网络拦截或ssh配置失效;镜像源不代理git clone,需配git全局代理并强制https协议或ssh走443端口,且密钥及配置文件权限必须为600。

Composer 连不上 GitHub,90% 不是中文环境问题,而是网络拦截或 SSH 配置没生效——它压根没走到“中文”那一步。
为什么改了 composer.json 还是直连 GitHub?
镜像源(如阿里云)只加速 packages.json 元数据和 ZIP 包下载,不代理 git clone 请求。只要 composer.json 里某个包的 source.url 是 https://github.com/xxx/yyy.git 或 git@github.com:xxx/yyy.git,Composer 就会原样交给 Git 执行,完全绕过镜像。
- 私有仓库、
"type": "vcs"包、fork 后未改source的包,全部直连 -
git://和ssh://协议在国内基本不可用,必须转成 HTTPS 或走 SSH+443 - 执行
composer install -v可看到真实拉取地址,确认是否被镜像覆盖
Git 代理比 Composer 代理更可靠
Composer 底层调用 git clone,所以只配 composer config -g http-proxy 是无效的。必须让 Git 自己走代理:
GInstall OneClick — 一键安装 GitHub 项目:规划、克隆、安装 Node 依赖、运行开发脚本。适用于想要获取 GitHubNode.js 项目的用户。
- 设 HTTP(S) 代理:
git config --global http.proxy http://127.0.0.1:7890和git config --global https.proxy http://127.0.0.1:7890 - 若代理需认证,写成
http://user:pass@127.0.0.1:7890 - SSH 地址(如
git@github.com)不走 HTTP 代理,必须先用composer config --global github-protocols https强制转成 HTTPS - 仅当前项目生效?去掉
--global,在项目目录下运行命令
SSH 连接超时不是密钥错,是端口 22 被拦
国内对 github.com:22 存在策略性限制。GitHub 官方推荐方案是改走 ssh.github.com:443,但必须配 ~/.ssh/config,否则 ssh -T git@github.com 永远失败——因为它默认连 22。
- 编辑
~/.ssh/config,内容严格如下(大小写、域名、路径都不能差):Host github.com Hostname ssh.github.com Port 443 User git IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60 ServerAliveCountMax 5
-
IdentityFile路径必须绝对且权限为 600:chmod 600 ~/.ssh/id_ed25519 - 验证方式不是
ssh -T git@github.com,而是:ssh -o "HostName=ssh.github.com" -o "Port=443" -T git@github.com -
~/.ssh/config文件自身权限也必须是 600,否则 OpenSSH 静默忽略
Host key verification failed 怎么办?
这是 SSH 第一次连接目标主机时的安全确认机制,不是错误。手动接受一次或预加载指纹即可:
- 本地调试:直接运行
ssh git@github.com,输入yes接受并保存到~/.ssh/known_hosts - CI/CD 环境(如 GitHub Actions):加一步
ssh-keyscan github.com >> ~/.ssh/known_hosts - 临时绕过(仅调试):
composer config -g github-protocols https,但注意这会让私有仓库失效,除非你同时配了 GitHub Token - 别漏掉
ssh-keyscan gitlab.com或自建服务域名,多个平台要分别加
最常被跳过的其实是权限控制:密钥文件、~/.ssh/config、~/.ssh/known_hosts 三者权限都必须是 600,任何一项不对,OpenSSH 就静默放弃——这种失败没有报错,只有超时或拒绝,最难排查。










