go mod download提示permission denied (publickey)是git底层ssh认证失败,因go委托git拉取代码,需确保~/.ssh/config正确配置host与identityfile、ssh-agent已加载密钥、import path为ssh格式(如git@gitlab.example.com:group/lib)且goprivate匹配路径。

go mod download 仍提示 permission denied (publickey)
这不是 Go 的问题,而是 git 命令在后台拉取代码时没用上你预期的 SSH 密钥。Go 模块下载全程委托给系统 git,它只认 ~/.ssh/config 里配好的 Host 别名和对应密钥,不看环境变量或 GOPRIVATE。
- 运行
ssh -T git@gitlab.example.com(把域名换成你的 GitLab 地址),确认能成功打印欢迎信息;失败说明 SSH 层就没通 - 检查
~/.ssh/config中是否为该 Host 显式指定了IdentityFile,且路径存在、权限是600 - 如果用了多个密钥,务必加
IdentitiesOnly yes,否则git可能轮询其他密钥导致认证被拒绝 - Mac 或 Linux 上,确保
ssh-agent已启动并已加载该密钥:ssh-add -l查看列表,ssh-add ~/.ssh/id_ed25519手动添加
设置了 GOPRIVATE 却还是走 HTTPS 被 401 拦截
GOPRIVATE 只告诉 Go “别走代理、别校验签名”,但不改变 git 实际用什么协议拉代码。如果你的模块 import path 是 https://gitlab.example.com/group/lib,Go 就会调 git clone https://...,哪怕你本地有 SSH 密钥也无用。
- 改 import path 为 SSH 格式:
git@gitlab.example.com:group/lib(注意是冒号不是斜杠) - 或者全局重写 URL:
git config --global url."ssh://git@gitlab.example.com/".insteadOf "https://gitlab.example.com/" - 验证重写是否生效:
git ls-remote ssh://git@gitlab.example.com/group/lib应返回 refs,而不是 403 - 别漏掉
GOPRIVATE=gitlab.example.com/**—— 单星号*不匹配嵌套路径,必须用双星号**
VS Code Remote-SSH 中 go mod 拉不到私有模块
远程终端里 git clone git@gitlab.example.com:group/lib 成功,但 go mod download 失败,大概率是 ssh-agent 没在非交互式 shell 中继承。
- VS Code Remote-SSH 默认启动的是非登录 shell,
ssh-agent环境变量(如SSH_AUTH_SOCK)不会自动传递 - 在远程
~/.bashrc或~/.zshrc末尾加:export SSH_AUTH_SOCK=$(ls -t /tmp/ssh-*/agent.* 2>/dev/null | head -n1) - 或者更稳妥:在 VS Code 的
settings.json中配置"remote.SSH.enableAgentForwarding": true - 检查远程
$SSH_AUTH_SOCK是否指向有效 socket:ls -l $SSH_AUTH_SOCK应显示 socket 文件,而非“no such file”
ED25519 密钥在某些环境报 “key format invalid”
不是密钥本身坏了,而是 OpenSSH 版本或系统策略不兼容。GitLab 16.3+ 和 Go 1.20+ 默认启用更强的证书验证,旧版 OpenSSH(
- 运行
ssh -V,确认输出包含 OpenSSH_8.2p1 或更高版本 - FIPS 模式下 ED25519 被禁用,此时只能退回到 RSA:用
ssh-keygen -t rsa -b 4096生成,且确保长度 ≤ 8192 位(GitLab 16.3+ 强制限制) - 检查私钥文件开头是否为
-----BEGIN OPENSSH PRIVATE KEY-----(新格式),如果是-----BEGIN RSA PRIVATE KEY-----,说明是老格式,需重新生成 - Windows 用户注意:Git for Windows 自带的 OpenSSH 可能滞后,建议用 WSL2 中的原生 OpenSSH
实际调试时最容易忽略的是:SSH 配置生效范围、git URL 重写是否覆盖所有子路径、以及非交互式 shell 下 ssh-agent 的上下文丢失。这三个点卡住,再多的 GOPRIVATE 设置都无效。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











