go get私有仓库超时本质是SSH认证失败,需先运行ssh -T git@host验证连接,若提示Permission denied(publickey)或卡住,说明密钥未加载、权限非600、~/.ssh/config Host配置错误或ssh-agent未启用。

go get 拉取私有仓库超时,根本不是网络问题
超时现象背后大概率是 SSH 密钥未正确加载或未匹配目标 Git 服务器的公钥。Go 默认走 SSH 协议拉取 git@github.com:org/repo 这类地址,但 ssh-agent 没有加载对应密钥,或者密钥权限不对、~/.ssh/config 中 Host 别名没对上,都会让连接卡在认证阶段,最终触发 go get 的默认 10 秒超时。
验证 SSH 连接是否就绪
别急着改 Go 配置,先确认底层 SSH 能否通:
- 运行
ssh -T git@github.com(或你私有 Git 服务的 Host,如git@gitlab.internal),看是否返回 “Hi xxx! You've successfully authenticated” - 如果提示
Permission denied (publickey),说明密钥没加载或不匹配;如果卡住几秒后失败,大概率是~/.ssh/config里 Host 配置缺失或端口写错 - 检查
ssh-add -l是否列出对应私钥;没列?执行ssh-add ~/.ssh/id_rsa_your_private(换成你实际密钥路径) - 确保密钥文件权限为
600:chmod 600 ~/.ssh/id_rsa_your_private
Go 如何强制走 SSH 或跳过认证校验
Go 不会自动读取 ~/.ssh/config 的 User/IdentityFile,它只依赖系统 SSH 环境。所以重点不是改 Go,而是让 ssh 命令本身能通:
- 确认
~/.ssh/config中有对应 Host 块,例如:Host github.com<br> User git<br> IdentityFile ~/.ssh/id_rsa_github
- 避免用 HTTPS 替代 SSH 来绕过问题(比如把
git@github.com:org/repo改成https://github.com/org/repo),因为 Go 模块校验会因 URL 协议不同而失败,报checksum mismatch - 临时调试可设环境变量跳过校验(仅限开发机):
GOPRIVATE=github.com/org/*,再配合GOINSECURE=github.com/org/*(注意:后者仅对 HTTPS 有效,SSH 下无效)
CI/CD 环境下密钥注入的常见坑
本地通了,CI 上仍超时?那基本是密钥没进容器或没被 ssh-agent 加载:
立即学习“go语言免费学习笔记(深入)”;
- Docker 构建中不能直接挂载
~/.ssh,要用ssh-agentsocket 转发或docker build --ssh default(需 Docker 18.09+) - GitHub Actions 中,
actions/checkout@v4默认不启用 SSH,得手动配置ssh-key输入,并确保后续步骤在同一个 job 中复用该 agent - GitLab CI 中,
SSH_PRIVATE_KEY变量内容必须是完整 PEM 格式(含-----BEGIN OPENSSH PRIVATE KEY-----),且需在before_script中写入文件并ssh-add - 所有场景下,
ssh -o ConnectTimeout=5 -T git@host是比go get更快的诊断手段——它绕过 Go 模块逻辑,直击 SSH 层
真正卡点往往不在 Go 配置,而在 SSH 密钥生命周期管理:生成、加载、转发、权限、Host 映射,缺一不可。漏掉任意一环,go get 就只能干等超时。


















