如何使用 Go 代理 https 请求,http 请求工作正常?

How to proxy https requests using Go, http requests work fine?

我会尽力解释一切,服务器的新东西!一切都在 Go 中,主要问题是 ServeHTTP。

问题

我正在处理 (http.server).ListenAndServe() 收到的转发请求,以便通过 (http.ReverseProxy).ServeHTTP(http.ResponseWriter, *http.Request) 发送到另一个代理服务器。我正在使用 python 请求提交 GET 请求并通过第一台服务器和第二台服务器将其代理到实际目标。我已经可以提交和接收http请求,但是我无法提交https请求。

错误

我经常收到来自 python 请求库的 502 bad gateway,这可能是当我使用 https://httpbin.org 或任何其他 https 站点时来自 ServeHTTP() 的 http: proxy error: unsupported protocol scheme "" 的结果。使用 http 结果 html 返回给我。

反应差异

*http.Response 的区别在于 http 是

&{GET http://httpbin.org HTTP/1.0 1 0 map[] <nil> <nil> 0 [] true http://httpbin.org map[] map[] <nil> map[] [my ip address] http://httpbin.org <nil> <nil> <nil> 0xc000050fc0}

而 https 是

&{CONNECT //httpbin.org:443 HTTP/1.0 1 0 map[] <nil> <nil> 0 [] true httpbin.org:443 map[] map[] <nil> map[] [my ip address] httpbin.org:443 <nil> <nil> <nil> 0xc0000503c0}

这是 *http.Request

文档的 link

我之前尝试过的

我试过修改 ReverseProxy.Director 属性并让函数修改 *http.Request。我已经完成了从删除“:443”到添加“https://”甚至“http://”的所有操作。这样做会导致错误请求错误。我也试过将 CONNECT 请求更改为 GET 或 POST,这两种方法都有奇怪的结果,包括无效方法或错误请求。

有什么帮助吗?

 ... CONNECT //httpbin.org:443 HTTP/1.0 ...

客户端执行了错误的请求。它需要是 CONNECT httpbin.org:443 HTTP/1.0,即只是目标服务器的域和端口。鉴于标准 Python 工具可以正确处理代理的 HTTPS,问题可能是由一些(未知的)自制代码发出错误的代理请求引起的。

我认为问题在于您无法真正正常地代理 https 请求。我假设您正在尝试根据您的描述将服务器用作另一个代理的代理,所以看起来您将不得不在中间人来欺骗代理请求以将其发送到实际代理服务器。

注意这可能不是个好主意,请确保在这种情况下所有请求都是安全的,因为中间服务器可以读取未加密的 https 信息。

不幸的是,我没有想到快速的解决方案。相反,您必须深入研究此 library 并修改特定的 MITM 请求并设置一个 https.go 将每个请求分发到的更多代理服务器池。

祝你好运!