答案是ssh密钥认证失败。该错误源于git调用ssh协议时无法通过公私钥验证身份,常见原因包括:本地无密钥或权限不符(私钥需600)、公钥未添加至github/gitlab、ssh-agent未运行或未加载密钥、~/.ssh/config配置不匹配、go模块url协议与认证方式不一致。

git clone 时提示 Permission denied (publickey)
这是最典型的 SSH 密钥问题表现,go mod download 或 go get 在拉取私有模块(如 GitHub/GitLab 私有仓库、公司内网 Git)时,底层调用 git clone,而 Git 没法用你的 SSH 密钥完成身份验证。
常见诱因包括:SSH agent 未启动、密钥没添加进 agent、~/.ssh/config 中 Host 配置与模块 URL 不匹配、Git 使用了 HTTPS 协议但模块地址写成了 SSH 格式(或反之)。
- 运行
ssh -T git@github.com(或对应 Git 服务器域名)确认基础连通性;失败则说明密钥或网络配置有问题 - 检查
git config --global url."git@github.com:".insteadOf "https://github.com/"这类重写规则是否生效——Go 会尊重 Git 的 URL 重写,但若配置错位(比如把git@gitlab.example.com:写成git@gitlab.example.com少了冒号),会导致协议解析失败 - 私有模块 URL 必须是 SSH 格式(
git@host:path/repo.git)才能走 SSH;如果用了 HTTPS 地址,Go 就不会尝试读 SSH 密钥,此时应配git config --global credential.helper store或使用 Personal Access Token
go mod download 报错:module github.com/xxx/yyy: git ls-remote failed
这个错误表面是 Git 命令失败,实际往往卡在 SSH 认证环节。Go 不会直接暴露 “Permission denied”,而是把底层 git ls-remote 的非零退出码包装成这个模糊提示。
关键点在于:Go 默认启用 GOPROXY=direct 时才会直连 Git 服务器;若设置了代理(如 GOPROXY=https://proxy.golang.org),私有模块会被跳过代理,仍需本地 Git 能访问源站——所以不能只靠 proxy 规避问题。
- 临时绕过:设
GOPROXY=direct+GOSUMDB=off,排除代理和校验干扰,聚焦定位 SSH 问题 - 检查 Go 是否用了系统 Git:执行
go env GOGITPROG,若为空,则依赖系统git;确保该 Git 可正常git clone git@xxx:repo.git - 模块路径中含下划线或大小写混用(如
git@gitlab.example.com:Team/My_Project.git)可能触发 Git 协议解析 bug,建议统一用小写字母和短横线
~/.ssh/config 中的 Host 别名没被 Go 正确识别
很多人给私有 Git 服务配了 Host 别名(如 Host gitlab → HostName gitlab.example.com),但 Go 调用 Git 时,若模块 import path 写的是 gitlab:/path/repo,Git 实际收到的是原始字符串,不会自动替换别名——除非你在 URL 中显式使用别名且 Git 配置正确。
根本原因:Go 解析模块路径时不做 SSH config 映射,它只是把路径传给 Git;Git 才负责查 ~/.ssh/config。所以必须保证传给 Git 的 URL 格式能命中配置中的 Host 条目。
- 模块路径必须写成
gitlab:path/repo.git(注意没有@,且冒号后是相对路径),才能匹配Host gitlab配置 - 若配置了
IdentityFile ~/.ssh/id_rsa_gitlab,请确认该文件存在、权限为600,且ssh-add -l能列出它 - 避免在
~/.ssh/config中使用通配符(如Host *.example.com),部分 Git 版本不支持,Go 调用时可能失效
Windows 上 OpenSSH for Windows 的 agent 不自动加载密钥
Windows 自带的 OpenSSH(C:\Windows\System32\OpenSSH\ssh-agent.exe)默认不随系统启动,也不自动将密钥加入 agent,导致 Go 调用 Git 时找不到可用密钥。
不同于 macOS 的 ssh-agent 启动即驻留,Windows 需手动初始化并持久化。
- 以管理员身份运行 PowerShell,执行:
Start-Service ssh-agent启动服务;再运行ssh-add ~/.ssh/id_rsa加载密钥 - 检查服务启动类型:
Get-Service ssh-agent | Select-Object StartType,若为Manual,设为自动:Set-Service ssh-agent -StartupType Automatic - PowerShell profile(
$PROFILE)里加if (!(Get-Service ssh-agent).Status -eq 'Running') { Start-Service ssh-agent },避免每次新开终端都手动启
SSH 密钥问题本质是 Go 和 Git 之间的协作断层:Go 只管传路径,Git 负责协议落地,而 SSH agent 是中间态服务。任何一环掉链子(密钥权限不对、agent 没运行、config 匹配失败、Git 版本太老),都会表现为“拉不到模块”。调试时优先隔离——单独用 git clone 测试,再看 go mod 是否复现,比直接改 Go 配置更可靠。











