使用Golang的go get命令在不安全代理下导入依赖包的方法
使用Golang的go get命令在不安全代理下导入依赖包的方法 大家好,感谢阅读。
首先,请原谅我的英语水平。
我的问题与 GOINSECURE 环境变量有关。
我在公司防火墙后面工作等等……我的目标是下载并导入(go get…)一个库。
因此,我工作中使用的代理使用的是 http(我知道…)。没有 https 可用。
所以我必须配置 GOPROXY 环境变量来使用正确的代理。并配置 GOINSECURE 环境变量,以忽略代理实际上使用的是 http 协议这一事实。
以下是我的(匿名)环境变量:
PS C:\Users\xx\Documents\go_policyExtractor> go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\xx\AppData\Local\go-build
set GOENV=C:\Users\xx\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=*.PROXY,PROXY,*.github.com,github.com #uncertainty; PROXY = corpo server hostname
set GOMODCACHE=C:\Users\xx\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\xx\go
set GOPRIVATE=
set GOPROXY=http://xx:XX@PROXY:8080 #xx = username; XX = password; PROXY = corpo server hostname
set GOROOT=C:\Users\xx\Documents\go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Users\xx\Documents\go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.17.2
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=C:\Users\xx\Documents\go_policyExtractor\go.mod
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\xx\AppData\Local\Temp\go-build3899924670=/tmp/go-build -gno-record-gcc-switches
如你所见,代理和不安全设置已配置……但任何 go get 的结果如下:
PS C:\Users\xx\Documents\go_policyExtractor> go get github.com/xuri/excelize
go: github.com/mohae/deepcopy@v0.0.0-20170929034955-c48cc78d4826: refusing to pass credentials to insecure URL: http://xx:xxxxx@PROXY:8080/github.com/mohae/deepcopy/@v/v0.0.0-20170929034955-c48cc78d4826.mod
我已经阅读过这个问题:cmd/go: support sending credentials to an insecure GOPROXY · Issue #35975 · golang/go · GitHub
并尝试了本地 CA 修复,但是……
PS C:\Users\xx\local_ca> mkcert -install
ERROR: add cert: failed adding cert: Access Refused.
我已经尝试了所有方法……
有人对我应该如何使用 GOINSECURE(这甚至是正确的变量吗?)有想法吗?
再次提醒:我的目标是通过公司的 http(非 https)代理使用 go get 从 github 下载代码。
感谢阅读;希望我的解释足够清楚。
更多关于使用Golang的go get命令在不安全代理下导入依赖包的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
是的,我认为唯一的问题在于凭据会通过明文HTTP发送。我猜如果你的代理不需要凭据或者连接是HTTPS的话,你当前的配置应该能正常工作。
更多关于使用Golang的go get命令在不安全代理下导入依赖包的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好 @Nokeni,
来自 cmd/go: 支持向不安全的 GOPROXY 发送凭据 · Issue #35975 · golang/go · GitHub
我们故意不支持向不安全的代理发送凭据。意外地在
https://URL 中漏掉s不应该导致凭据在网络上以未加密的方式发送。
因此,凭据错误是设计使然。
看起来公司服务器需要配置为使用 https,或者无需凭据即可访问。
嗨 @christophberger,感谢您的关注。
我完全同意您的评论。
但这不正是 GOINSECURE 环境变量的目的所在吗?
以下是实现了 GOINSECURE 变量的 Go 版本发布说明: https://golang.org/doc/go1.14
这份发布说明中(至少对我们而言)有趣的一点是:
环境变量
GOINSECURE 是一个新的环境变量,它指示 go 命令在直接从其源获取某些模块时,不需要 HTTPS 连接,并跳过证书验证。与现有的 GOPRIVATE 变量类似,GOINSECURE 的值是一个以逗号分隔的全局模式列表。
因此,我原以为使用这个变量,最终就能访问 GitHub 了。
所以,这到底是一个 Bug,还是我理解有误?
编辑:我想,根据您的评论,问题的关键在于凭证。我猜,如果 URL 中没有凭证,使用 GOINSECURE 我就能通过代理以 HTTP 方式访问 GitHub 了……谢谢。
根据你的描述,问题在于Go工具拒绝向不安全的HTTP代理发送凭据。GOINSECURE环境变量用于指定哪些模块路径可以跳过TLS验证,但它不能解决向HTTP代理发送凭据的问题。
以下是解决方案:
// 首先,设置环境变量(Windows PowerShell)
$env:GOPROXY = "http://PROXY:8080"
$env:GOPRIVATE = "github.com"
$env:GONOPROXY = ""
// 对于需要认证的代理,不要在URL中包含凭据
// 而是使用netrc文件或环境变量
// 方法1:使用环境变量设置代理认证
$env:HTTP_PROXY = "http://xx:XX@PROXY:8080"
$env:HTTPS_PROXY = "http://xx:XX@PROXY:8080"
// 方法2:创建netrc文件(Windows位置)
// C:\Users\xx\_netrc 或 C:\Users\xx\.netrc
// 内容:
// machine PROXY
// login xx
// password XX
// 然后尝试go get
go get -insecure github.com/xuri/excelize
如果上述方法仍然不行,可以尝试使用-insecure标志:
go get -insecure github.com/xuri/excelize
或者配置Go使用直接连接绕过代理:
// 临时禁用代理
$env:GOPROXY = "direct"
// 设置GOINSECURE允许特定域的不安全连接
$env:GOINSECURE = "github.com,*.github.com"
// 然后运行
go get github.com/xuri/excelize
对于企业环境,建议设置本地模块代理:
// 使用athens或goproxy.io搭建本地代理
$env:GOPROXY = "http://localhost:3000"
// 或者使用多个代理源
$env:GOPROXY = "http://PROXY:8080,direct"
如果代理问题持续存在,可以考虑离线方式:
# 1. 在其他网络下载模块
go mod download
# 2. 复制整个mod缓存
# C:\Users\xx\go\pkg\mod
# 3. 在工作机器上使用vendor模式
go mod vendor
关键点是:Go 1.16+版本加强了安全限制,不再允许向纯HTTP代理发送凭据。解决方案要么是让代理支持HTTPS,要么使用上述的变通方法。

