gonosumdb仅跳过校验和验证,不绕过代理;必须配goprivate才能让go直连私有git服务器并跳过代理与校验数据库。

GONOSUMDB 不是用来“黑名单”私有模块的,它只影响校验行为——配错会导致 go.sum 被跳过验证,直接引入安全风险。
为什么 GONOSUMDB 不能替代 GOPRIVATE
很多人误以为设 GONOSUMDB=git.internal.company.com 就能绕过校验、让私有模块正常拉取。这是错的:它只是告诉 Go “别查这个域名的校验和”,但 go get 仍会尝试通过 GOPROXY 去拉取,结果还是 401 Unauthorized 或 404 Not Found。真正该配的是 GOPRIVATE,它会让 Go 完全跳过代理和校验数据库,直连你的私有 Git 服务器。
-
GOPRIVATE控制“是否走代理 + 是否查 GOSUMDB” -
GONOSUMDB只控制“是否查 GOSUMDB”,不改变代理行为 - 两者都设,
GOPRIVATE优先级更高;只设GONOSUMDB,问题照旧
什么时候才需要配 GONOSUMDB
极少数场景下,你确实需要关掉某类模块的校验:比如内部 CI 流水线中临时使用未签名的 fork 分支,或测试阶段依赖尚未发布到可信源的预编译模块。此时应明确限定范围,避免全局放行:
- 用逗号分隔多个域名:
go env -w GONOSUMDB="git.internal.company.com,github.com/myorg/internal-fork" - 支持通配符:
go env -w GONOSUMDB="*.internal.company.com" - 绝对不要设成
all或off—— 这等于主动关闭整个项目的校验保护 - 配完后执行
go mod download观察日志:若看到skipping checksum verification,说明生效
GONOSUMDB 和 GOSUMDB 冲突时谁生效
如果同时设置了 GOSUMDB=off 和 GONOSUMDB=github.com/foo,Go 会以 GOSUMDB=off 为准,即所有模块都不校验。但更常见的是隐式冲突:比如 GOSUMDB=sum.golang.org(默认) + GONOSUMDB=git.internal.company.com,这时只有后者被豁免,其余仍走官方校验库。
-
GOSUMDB=off是全局禁用,覆盖一切GONOSUMDB设置 -
GONOSUMDB是白名单式豁免,仅对匹配域名生效 - 企业内网中若自建了校验服务(如 Athens),应设
GOSUMDB=https://sum.internal.company.com,而非滥用GONOSUMDB
真正容易被忽略的点是:GONOSUMDB 的作用域只在下载/首次校验阶段,一旦模块写入 go.sum,后续 go build 仍会验证本地缓存哈希——除非你手动删了 go.sum 或设了 GOSUMDB=off。所以它不是“永久豁免”,而是“首次跳过”。











