git credential helper 是 https 私有仓库认证的核心,go 完全依赖 git 凭据系统;ssh 认证需满足 ssh -t 通、~/.ssh/config 正确配置、go.mod 路径与 ssh url 一致;goprivate 必须显式设置以绕过公共代理;自签名证书需配置 git 而非 go。

git credential helper 是 HTTPS 私有仓库认证的核心
Go 本身不处理 HTTPS 凭证,完全依赖 git 命令的凭据系统。如果你用 https://git.company.com/team/lib 这类地址,go get 失败报 401,问题一定出在 git 层——不是 Go 配错了,而是 git 没存住你的 token 或密码。
实操建议:
- 运行
git config --global credential.helper store(Linux/macOS)或git config --global credential.helper manager(Windows Git for Windows) - 首次
go get git.company.com/team/lib时,会弹出用户名/密码输入框;此时必须填 Personal Access Token(PAT),而非账号密码(GitHub/GitLab 等已禁用密码直连) - 凭证存入后,路径为
~/.git-credentials(store 方式)或系统凭据管理器(manager 方式),后续所有git clone和go get自动复用 - 别把 token 写进 URL 如
https://TOKEN:x-oauth-basic@git.company.com/...——容易泄露、日志明文、go mod vendor后仍需运行时认证
SSH 密钥认证必须满足三个条件才真正生效
用 git@git.company.com:team/lib 这种 SSH 地址时,go get 成败和 Go 无关,只取决于 ssh -T git@git.company.com 能否通。常见“配置了密钥却拉不到”的原因,往往卡在这三处。
实操建议:
-
ssh -T git@git.company.com必须返回类似Welcome to GitLab, @username!—— 不是权限拒绝,也不是 host unknown -
~/.ssh/config中要显式定义 Host 别名,并指定用户和密钥路径:Host git.company.com User git IdentityFile ~/.ssh/id_rsa_company
-
go.mod中的module声明和import路径必须与 SSH URL 的 host 一致,例如module git.company.com/team/lib,不能写成module github.com/company/lib - 避免混用协议:如果
~/.gitconfig里没配insteadOf,Go 默认尝试 HTTPS 回退,而你只配了 SSH,就会静默失败
GOPRIVATE 设置错误会导致凭证根本没机会被使用
很多人配好了 git credential 或 SSH,但 go get 依然报 unknown revision 或 module not found。根本原因是 Go 根本没把模块当私有处理——它默认走公共代理,跳过所有认证流程,直接向 proxy.golang.org 发请求。
实操建议:
- 设置
GOPRIVATE=git.company.com(注意:不是*.company.com,Go 不支持域名通配符) - 多个域名用英文逗号分隔、无空格:
GOPRIVATE=git.company.com,gitlab.internal,github.com/my-org/* - 路径匹配是前缀匹配:
github.com/my-org/*可匹配github.com/my-org/lib,但不匹配github.com/my-org/sub/repo(单星号只匹配一级) - 验证是否生效:
go env GOPRIVATE输出应非空;再跑go list -m all,若不再报verifying ... checksum mismatch,说明已绕过 sumdb
自签名证书或内网 CA 证书需要额外配置 git,不是 Go 的事
设置了 GOPRIVATE 和凭证,却报 x509: certificate signed by unknown authority?这不是 Go 的 TLS 配置问题,而是 git 在用 HTTPS 协议拉取时校验失败。Go 调用的是 git clone,最终走的是 libcurl 或系统的 SSL 库。
实操建议:
- 开发环境临时绕过:
GOINSECURE=git.company.com(仅限内网测试,生产禁用) - 生产环境正确做法:把内网 CA 证书加到系统信任链(如 Linux 的
/usr/local/share/ca-certificates/+update-ca-certificates) - 或让
git显式信任该证书:git config --global http."https://git.company.com/".sslCAInfo /path/to/internal-ca.crt - 别试图用
export GIT_SSL_NO_VERIFY=true——这会影响所有 git 操作,且 Go 不读这个变量
最关键的细节:所有认证环节都发生在 git 这一层,Go 只是调用者。只要 git clone https://git.company.com/team/lib.git 和 git clone git@git.company.com:team/lib.git 都能成功,go get 就不会卡在凭证上。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











