私有模块下载卡在verifying阶段是因为go默认访问sum.golang.org校验checksum,而该服务在国内不可达;必须同步配置gonoproxy和gonosumdb为相同域名列表,且不带协议头或路径,否则校验仍失败。

为什么私有模块下载卡在 verifying 阶段
不是网络慢,而是 Go 默认启用 checksum 校验(sum.golang.org),但该服务在国内不可达。当模块域名不在 GONOSUMDB 白名单里时,Go 会反复重试校验失败,最终超时或报 verifying github.com/xxx@v1.2.3: checksum mismatch —— 实际上模块早已下载完,只是卡在校验环节。
必须同时配置 GONOPROXY 和 GONOSUMDB
只设 GONOPROXY 不够,GONOSUMDB 必须同步设置,否则 Go 仍会尝试去 sum.golang.org 校验私有模块。两者值必须完全一致,且不支持通配符:
go env -w GONOPROXY="git.internal.company.com,gitlab.myorg.net"go env -w GONOSUMDB="git.internal.company.com,gitlab.myorg.net"- 若用
direct作为GOPROXY的 fallback,GONOPROXY可省略,但GONOSUMDB仍不可少
避免 GOINSECURE 全局开启
GOINSECURE 会跳过 TLS 校验,风险高,仅应在内网无证书环境临时使用。更安全的做法是:
- 对特定域名精准放行:
go env -w GOINSECURE="git.internal.company.com" - 配合自签名证书:把 CA 证书加到系统信任链,而非关校验
- 不要设
GOINSECURE="*"—— 这会让所有 HTTPS 请求降级为 HTTP,可能被中间人劫持
私有模块拉取失败时的快速定位步骤
运行 go list -m -u all -v,观察输出中哪一行卡住。常见线索包括:
-
get https://sum.golang.org/lookup/xxx@v1.2.3: 403 Forbidden→ 检查GONOSUMDB -
Get "https://git.internal.company.com/xxx.git/info/refs?service=git-upload-pack": dial tcp: i/o timeout→ 检查GONOPROXY或 Git 协议代理 -
go: git.internal.company.com/xxx@v1.2.3: invalid version: git ls-remote -q origin in /tmp/gopath/pkg/mod/cache/vcs/xxx: exit status 128→ Git 认证失败,需配git config --global url."https://token@".insteadOf "https://"
https://)或路径后缀(如 /myrepo),只写域名或子域名即可。多一个点、少一个字母,都会导致校验继续走默认通道。











