go 1.13+ 默认强制 https 和校验,访问 http 私有仓库时报 “insecure” 错误;必须配置 goinsecure 指定域名跳过 tls 校验,并同步设置 goprivate 避免代理和 checksum 校验,二者缺一不可。

为什么 go get 报 “insecure” 错误
Go 1.13 起默认启用模块校验和(GOINSECURE 未配置时)强制要求 HTTPS + 校验,如果依赖源是 HTTP 或自建私有仓库(如 http://git.internal.com/repo),go get 会直接拒绝下载并报错:refusing to download ... over HTTP without --insecure 或类似提示。
这不是证书问题,而是 Go 模块安全策略的硬性拦截 —— 即便你用 --insecure 参数也无效(该参数已被移除),必须通过环境变量或配置绕过。
设置 GOINSECURE 环境变量(最常用)
这是解决私有 HTTP 仓库依赖的核心方式。它告诉 Go:对指定域名跳过 TLS 和校验检查。
- 只对匹配的域名生效,不影响其他模块(比如
github.com仍走 HTTPS) - 支持通配符,如
GOINSECURE="*.internal.com"或多个域名用逗号分隔:GOINSECURE="git.internal.com,repo.company.dev" - Windows 命令行需用
set GOINSECURE=git.internal.com;Linux/macOS 用export GOINSECURE=git.internal.com - 若在 CI/CD 中使用,务必在
go mod download或go build前设置,否则无效
配合 GOPRIVATE 使用才真正安全
仅设 GOINSECURE 会让 Go 对这些域名完全跳过校验,但更推荐叠加 GOPRIVATE —— 它让 Go 认为这些模块是“私有”的,从而自动禁用代理(GOPROXY)和校验服务器(GOSUMDB)。
-
GOPRIVATE必须包含和GOINSECURE相同的域名,例如:GOPRIVATE="git.internal.com,repo.company.dev" - 两者可一起导出:
export GOPRIVATE=git.internal.com; export GOINSECURE=git.internal.com - 如果不设
GOPRIVATE,Go 可能仍尝试走proxy.golang.org或校验sum.golang.org,导致失败或泄露内部路径
临时调试:用 -mod=mod 和本地 replace 绕过网络依赖
当无法修改环境变量(如受限 CI 环境),或只想验证某模块是否真有问题,可用本地替换快速绕过:
- 在
go.mod中添加:replace example.com/internal/lib => ./local-fork - 或命令行一次性替换:
go get -mod=mod example.com/internal/lib@v0.1.0后手动replace - 注意:
replace不解决构建时实际拉取,只影响go build阶段的路径解析;真正下载仍可能失败,所以仍是辅助手段 - 此法适合开发调试,不适用于自动化构建或生产部署
真正容易被忽略的是:即使设置了 GOINSECURE,如果 GOPROXY 指向了公共代理(如 https://proxy.golang.org),Go 仍会先去代理查模块元数据 —— 而代理根本不知道你的私有域名,返回 404 后才 fallback 到直连。所以 GOPRIVATE 必须同步配置,否则你会看到奇怪的 “not found” 而不是 “insecure” 错误。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











