应优先配置官方中国镜像sum.golang.google.cn而非关闭GOSUMDB=off,因checksum mismatch主因是sum.golang.org访问失败,关闭校验将彻底放弃依赖完整性保护,增加供应链攻击风险。

不要全局关 GOSUMDB=off,除非你清楚自己在放弃什么。 它不是“跳过校验提速”,而是彻底移除依赖完整性保护层,CI 流水线里启用等于主动接受供应链攻击风险。
为什么 go build 报 checksum mismatch 却想关 GOSUMDB
这类报错几乎从不源于模块本身损坏,而是 sum.golang.org 访问失败导致本地 go.sum 与远程校验和无法比对。国内常见原因包括 DNS 污染、企业防火墙拦截 HTTPS 响应、或 GOPROXY 配置错误(比如把 sum.golang.org 也扔进了代理链)。直接设 GOSUMDB=off 是绕过问题,不是解决问题。
-
GOSUMDB=off后,go工具链完全忽略go.sum内容,也不再请求任何校验服务,只信任你本地磁盘上已有的文件——哪怕它被篡改过、缺失、或压根没提交到 Git - 如果你的项目用了私有
GOPROXY或自建镜像,GOSUMDB=off会让所有拉取行为失去验证锚点,一次中间人劫持就可能污染整个依赖树 -
go mod verify在GOSUMDB=off下永远返回 success,失去 CI 中最关键的防篡改检查能力
正确做法:换镜像,不是关校验
官方为中国用户提供了可信镜像 sum.golang.google.cn,它由 Go 团队用相同私钥签名,客户端硬编码公钥可直接验证,无需额外配置证书。
- 运行
go env -w GOSUMDB=sum.golang.google.cn,立即生效 - 验证是否成功:
go env GOSUMDB应输出该地址,且后续go mod download日志中不再出现fetching sum.golang.org - 若仍失败,检查是否误将
sum.golang.google.cn加入了GOPROXY(它不该走代理),或GOINSECURE是否错误包含了该域名
真要临时绕过?用更细粒度的方案
某些私有模块确实无法接入公共校验体系,但没必要全局退化。Go 提供了精准控制方式:
立即学习“go语言免费学习笔记(深入)”;
- 对特定域名禁用校验:
go env -w GOINSECURE="git.internal.company.com",仅影响该域下的模块,不影响其他依赖 - 配合
GOPRIVATE使用:go env -w GOPRIVATE="git.internal.company.com"确保这些域名不走GOPROXY,再用GOINSECURE关闭其校验,逻辑清晰、边界明确 - 避免混用:
GOPROXY=https://goproxy.cn,direct中的direct不会触发GOSUMDBfallback,它只控制下载路径,校验仍走GOSUMDB配置
最常被忽略的是:关掉 GOSUMDB 后,go.sum 文件本身变成无意义的摆设。它既不参与校验,也不再被 go mod tidy 更新,下次有人手动删掉它,整个项目就彻底失去依赖一致性保障。


















