Go模块安全代理是指GOPROXY、GOSUMDB与GOINSECURE/GONOSUMDB协同工作的代理体系,区别于仅解决下载速度的普通代理;它必须确保模块可下载、校验和可验证、私有路径不被强制校验,三者缺一不可,否则go build会卡在verifying阶段或报checksum mismatch错误。

什么是Go模块安全代理,和普通代理有什么区别
Go模块安全代理不是指“加密传输”,而是指能同时满足 GOPROXY + GOSUMDB + GOINSECURE/GONOSUMDB 三者协同工作的代理体系。普通代理只解决下载慢问题,而安全代理必须保证:模块可下载、校验和可验证、私有路径不被强制校验。缺一不可,否则 go build 会卡在 verifying 阶段或报 checksum mismatch 错误。
配置GOPROXY与GOSUMDB联动(关键步骤)
从 Go 1.13 起,GOSUMDB 默认为 sum.golang.org,它和 GOPROXY 是解耦的——即使你用了 https://goproxy.cn,校验和仍会去海外服务器查。国内镜像如七牛云(goproxy.cn)已内置 sum.golang.org 的代理能力,但阿里云/清华源等需显式配对:
-
go env -w GOPROXY=https://goproxy.cn(自动代理 sumdb) -
go env -w GOSUMDB=off(禁用校验,仅测试用,不推荐) -
go env -w GOSUMDB=sum.golang.google.cn(国内可用的官方校验服务,需配合GOPROXY使用)
注意:GOSUMDB=sum.golang.google.cn 本身不提供模块下载,只是校验服务;它必须和能返回正确 .mod 和 .zip 的 GOPROXY 搭配使用,否则 go 命令会因无法获取元数据而失败。
私有模块路径如何绕过校验(GONOSUMDB + GOINSECURE)
当你的模块路径是 git.internal.company.com/mylib 这类内网地址时,sum.golang.org 根本无法访问,必须显式豁免:
立即学习“go语言免费学习笔记(深入)”;
-
go env -w GONOSUMDB="git.internal.company.com/*":告诉 Go 不要对匹配路径的模块查校验和 -
go env -w GOINSECURE="git.internal.company.com":允许对该域名走 HTTP(非 HTTPS),适用于未配 TLS 的内网 Git
⚠️ 容易踩的坑:GONOSUMDB 是 glob 模式,不是正则;git.internal.company.com/mylib/v2 会被 git.internal.company.com/* 匹配,但 git.internal.company.com(无尾部 /*)不会生效;GOINSECURE 只接受域名,不能带端口或路径。
企业级自建代理(如 Nexus)必须关闭 direct fallback
如果你用 Nexus 或自建 goproxy 服务,且所有模块(包括公有和私有)都应经由该代理分发,就不能保留 direct:
-
go env -w GOPROXY=https://my-goproxy.internal.company.com(去掉,direct) - 同时确保该代理支持
/@v/list、/@v/vX.Y.Z.info、/@v/vX.Y.Z.mod、/@v/vX.Y.Z.zip全路径,并能解析私有域名 - 若代理不支持
sum.golang.org代理,需搭配GOSUMDB=off或自建sumdb服务(极少人这么做)
最常被忽略的一点:Nexus 的 go (proxy) 仓库默认只代理 proxy.golang.org,要让它也代理你自己的私有 Git 域名,必须在 Remote Storage URL 中填入对应地址(如 https://git.internal.company.com),否则 go get 会因 404 直接失败,根本不会走到 direct 阶段。


















