
Go 1.14 起已弃用 go get -insecure,推荐通过环境变量 GOINSECURE 指定信任的私有域名,使 go get 跳过 TLS 证书验证,从而支持从使用自签名证书的内部代码仓库(如 Bitbucket Server/Stash)拉取模块。
go 1.14 起已弃用 `go get -insecure`,推荐通过环境变量 `goinsecure` 指定信任的私有域名,使 `go get` 跳过 tls 证书验证,从而支持从使用自签名证书的内部代码仓库(如 bitbucket server/stash)拉取模块。
在企业或内网开发环境中,团队常将 Git 服务(如 Bitbucket Server、GitLab Self-Managed 或 Nexus Repository)部署在 HTTPS 下,并使用自签名或私有 CA 签发的证书。此时执行 go get your-company.com/repo/pkg 会失败,并抛出典型错误:
x509: certificate signed by unknown authority
这是因为 Go 的 net/http 客户端默认严格校验 TLS 证书链,不接受未经系统信任根证书签发的证书。
✅ 正确且受官方支持的解决方案是设置 GOINSECURE 环境变量(自 Go 1.13 引入,Go 1.14 起成为唯一推荐方式):
- GOINSECURE 接受以逗号分隔的域名模式列表(支持通配符 * 前缀,如 *.example.com),仅对匹配的 host 跳过 TLS 证书验证;
- 该设置不影响其他 HTTPS 请求(如 http.Get),仅作用于 go get、go list -m、go mod download 等模块获取操作;
- 不等同于全局禁用 TLS 验证,具备明确的作用域控制,兼顾安全性与实用性。
✅ 配置示例
假设你的 Stash/Bitbucket Server 地址为 stash.internal.company,在 shell 中执行:
# 临时生效(当前终端) export GOINSECURE=stash.internal.company # 或永久生效(以 zsh 为例,写入 ~/.zshrc) echo 'export GOINSECURE=stash.internal.company' >> ~/.zshrc source ~/.zshrc
若需同时信任多个私有域名,可使用逗号分隔:
export GOINSECURE=stash.internal.company,gitlab.corp,*.dev.internal
⚠️ 注意:GOINSECURE 不支持端口号或完整 URL(如 https://stash.internal.company:8443 是非法值),仅接受纯域名或通配符域名(如 stash.internal.company 或 *.corp)。
配置完成后,即可正常拉取模块:
go get stash.internal.company/myproject/mypkg@v1.2.0 # ✅ 成功:跳过证书校验,完成模块下载与构建
? 安全提醒与最佳实践
❌ 禁止设置 GOINSECURE=* —— 这将完全禁用所有模块下载的 TLS 验证,极大增加中间人攻击风险;
✅ 推荐最小化原则:仅列出必需的内部域名,避免泛域名过度开放;
✅ 生产构建环境(CI/CD)中应避免设置 GOINSECURE;建议改用私有证书颁发机构(Private CA)并将其根证书注入 Go 构建容器的系统信任库(如 /etc/ssl/certs/ca-certificates.crt);
-
✅ 若使用 Go Modules,还可配合 GOPRIVATE(自动跳过代理与校验)协同使用:
export GOPRIVATE=stash.internal.company,*.corp export GOINSECURE=stash.internal.company,*.corp
此时 go get 对这些域名既不走 proxy,也不校验证书,更符合私有模块管理规范。
总之,GOINSECURE 是 Go 官方为私有生态设计的安全可控机制。合理配置它,既能打通自签名证书场景下的模块依赖链,又不会牺牲整体安全水位。











