Go install执行失败:代理TLS握手错误及自定义Dial函数疑问
Go代理环境下
go install TLS握手错误问题解决 问题场景
执行命令:
go install -v golang.org/x/tools/cmd/godoc@latest
出现报错:
proxyconnect tcp: tls: first record does not look like a TLS handshake
用户处于公司代理环境(Windows主机),推测原因是客户端与代理服务器通信未使用HTTPS。相关配置如下:
Windows环境变量代理配置
C:\>reg query HKEY_CURRENT_USER\Environment | findstr /R .PROXY. HTTP_PROXY=http://myuser:mypass@proxy.company:port HTTPS_PROXY=https://myuser:mypass@proxy.company:port # 尝试过改为http开头 # HTTPS_PROXY=http://myuser <-- no https NO_PROXY=localhost,127.0.0.1,.mycomp.com,.foo.mycomp,localhost:5001
将HTTPS_PROXY改为http://开头后问题仍未解决。
Git HTTP配置
C:\>git config -l | findstr /R http. http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt http.sslbackend=openssl http.proxy=http://myuser:mypass@proxy.company:port http.sslverify=false https.proxy=http://myuser:mypass@proxy.company:port
参考信息
曾有通过自定义customDialContext解决同类报错的案例(用于REST服务调用):
// 自定义拨号函数处理连接 func customDialContext(ctx context.Context, network, addr string) (net.Conn, error) { conn, err := net.Dial(network, addr) return conn, err }
需解决的问题
- 如何正常使用
go install命令 - 如何避免或忽略上述TLS握手错误
- 自定义Dial函数是否可用于
go install命令
解决方案
1. 正常使用go install的配置调整
针对公司**HTTP代理(非HTTPS代理)**场景,需确保Go代理配置与系统、Git配置一致,强制Go用HTTP与代理通信:
- 单次临时生效:执行
go install前临时覆盖环境变量:set HTTPS_PROXY=http://myuser:mypass@proxy.company:port && go install -v golang.org/x/tools/cmd/godoc@latest - 系统永久生效:
- 打开Windows系统环境变量设置,将
HTTPS_PROXY修改为http://myuser:mypass@proxy.company:port(与Git配置保持一致) - 添加Go专属环境变量:
若公司有内部Go代理,将setx GOPROXY "https://proxy.golang.org,direct" setx GOSUMDB "sum.golang.org"GOPROXY替换为内部地址即可。
- 打开Windows系统环境变量设置,将
- 验证配置:执行
go env | findstr /R PROXY,确认HTTPS_PROXY、HTTP_PROXY均为http://开头,NO_PROXY包含本地地址和公司内部域名。
2. 避免/忽略TLS握手错误
该错误核心是Go尝试用HTTPS连接仅支持HTTP的代理,需从配置根源修正,而非单纯忽略:
- 确保所有HTTPS请求相关的代理配置(
HTTPS_PROXY、Go内置代理参数)均使用http://前缀,禁止用https:// - 若代理存在自签名证书等问题,可临时关闭Go的SSL验证(仅测试场景使用,不推荐生产环境):
或针对所有域名:setx GOINSECURE "golang.org/x/tools"setx GOINSECURE "*"
3. 自定义Dial函数能否用于go install
不能直接用于go install命令。customDialContext是Go应用代码层面的网络自定义逻辑,仅适用于开发者自己编写的程序。go install属于Go工具链内置命令,其网络通信逻辑由工具链内部实现,不支持用户注入自定义Dial函数。
内容的提问来源于stack exchange,提问作者surfmuggle
相关产品推荐
相关产品推荐

