私有仓库模块拉取时 checksum mismatch 和 x509 错误需分别处理:前者因缓存污染或 tag 被强制覆盖,应清 modcache、删 go.sum 并设 GOPROXY=direct 验证;后者因 Go 与 git 各自校验证书,需同时配置 GOCERTIFICATEPATH 和 git sslCAInfo。

私有仓库模块拉取时出现 checksum mismatch 或 x509: certificate signed by unknown authority,不是网络不通,也不是权限配错了——而是 Go 在校验环节卡在了两个地方:一是模块内容哈希对不上(go.sum 与实际 zip 不一致),二是 TLS 证书不被信任(Go 不读系统 CA)。这两个问题必须分开处理,混着调只会越调越乱。
go get 报 checksum mismatch:先清缓存再绕代理验证
这个错误本质是本地缓存或代理返回了污染包,和证书无关。常见于公司内网镜像同步滞后、作者强制覆盖 tag、或 GOPROXY 节点缓存了旧版 zip。
- 执行
go clean -modcache彻底清掉所有模块缓存(别只删go.sum,它只是记录,源头在缓存里) - 删掉项目根目录的
go.sum(避免旧哈希干扰重建) - 临时禁用代理验证:Linux/macOS 执行
export GOPROXY=direct,Windows 执行set GOPROXY=direct,再跑go get -u git.example.com/org/repo - 如果
direct成功,说明问题出在代理;可改用GOPROXY=https://proxy.golang.org,direct回退兜底 - 若仍失败,查
go.sum中该模块对应行,用go mod download -json git.example.com/org/repo@v1.2.3看实际 commit,确认是否作者 force push 覆盖了 tag——此时只能改用 commit hash 锁定:git.example.com/org/repo@v1.2.3-0.20240101123456-abc123def456
x509 certificate signed by unknown authority:GOCERTIFICATEPATH 只管 Go,不管 git
Go 自己的 HTTP 客户端(如 go get 走 HTTPS 模块代理路径)用 GOCERTIFICATEPATH 加载自定义根证书;但如果你的私有模块走的是 git clone 路径(比如设置了 GOPRIVATE),那 Git 命令根本不认这个变量。
- Go 层面:确保 Go ≥ 1.21,把 PEM 格式根证书(如
internal-ca.crt)放进/opt/my-ca/,再执行go env -w GOCERTIFICATEPATH=/opt/my-ca - Git 层面:单独配置
git config --global http.sslCAInfo /opt/my-ca/internal-ca.crt,否则git clone https://git.example.com/org/repo仍会报错 - 不要设
InsecureSkipVerify = true—— 它只跳过证书链验证,不解决 SNI 匹配失败、协议协商卡住等底层握手问题 - 若用 HTTP 内网地址(如
http://gitlab.internal),必须配GOINSECURE=gitlab.internal,且GOPROXY必须含direct
GOPRIVATE 配错导致 401/unknown revision:域名匹配极其严格
GOPRIVATE 不是模糊匹配,也不自动包含子域名。设成 example.com,git.example.com 就完全不受影响,Go 还是会把它当公共模块走代理,结果就是 401 或 404。
立即学习“go语言免费学习笔记(深入)”;
- 正确写法:
go env -w GOPRIVATE="git.example.com/**,gitee.com/my-team/*"(**匹配任意深度,*只匹配一级) - 多个域名用英文逗号分隔,**严禁空格**;Windows PowerShell 用户用
$env:GOPRIVATE="git.example.com/**" - 如果模块地址含端口(如
git.example.com:8443/repo),GOPRIVATE必须写成git.example.com:8443/**,端口不能省略 - 设置后运行
go env GOPRIVATE确认生效,再执行go list -m all看是否还有 verifying 报错 - 401 错误一定出在 Git 层,和 Go 无关——先手动
git clone https://git.example.com/repo测试,通了go get才可能通
最易被忽略的点:同一个私有模块,可能同时触发 checksum mismatch 和 x509 错误,但它们的修复路径完全独立。缓存清理解决不了证书问题,加 CA 证书也救不了被污染的 zip。得先看错误信息里明确写的关键词,再选对应路径,别指望一个命令全搞定。


















