如何使用Go代理HTTPS请求,而HTTP请求正常工作?

4

我将尽我所能解释一切,对服务器的东西还不熟悉!所有内容都是用 Go 编写的,主要问题在于 ServeHTTP。

问题

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

错误

我不断地从 python 请求库中收到 502 bad gateway,很可能是由于 ServeHTTP() 中的 http: proxy error: unsupported protocol scheme "" 导致的,当我使用 https://httpbin.org 或任何其他 https 站点时。使用 http 会返回 html。

响应差异

*http.Response 的 http 和 https 差异在于

&{GET http://httpbin.org HTTP/1.0 1 0 map[] <nil> <nil> 0 [] true http://httpbin.org map[] map[] <nil> map[] [我的 IP 地址] 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[] [我的 IP 地址] httpbin.org:443 <nil> <nil> <nil> 0xc0000503c0}

这是一个关于 *http.Request 的链接

我之前尝试过的

我尝试修改 ReverseProxy.Director 属性并使函数修改 *http.Request。我已经尝试了从中删除“:443”并添加“https://”或甚至“http://”,但这样会导致错误请求。我还尝试将 CONNECT 请求更改为 GET 或 POST,两者都有奇怪的结果,包括无效方法或错误请求。

有什么帮助吗?


底层错误是“不支持的协议方案”,这意味着URL的方案部分(如http,https)不存在。在您的情况下,HTTPS情况下的*http.Request缺少URL开头的“https:”,但您想要 “https://httpbin.org:443”。您可以分享创建HTTPS请求的代码吗? - nishanthshanmugham
2个回答

1
我认为问题在于通常无法代理https请求。根据您的描述,我假设您正在尝试将服务器用作另一个代理的代理,因此看起来您需要进行中间人攻击,以欺骗代理请求并将其发送到实际的代理服务器。
请注意,这可能是一个不好的主意,请确保如果是这种情况,则所有请求都是安全的,因为中间服务器可以读取未加密的https信息。
不幸的是,我想不到任何快速的解决方案。相反,您必须深入研究此library并修改特定的MITM请求,并设置进一步代理服务器池,以便https.go将每个请求分发到其中。
祝你好运!

1
 ... CONNECT //httpbin.org:443 HTTP/1.0 ...
客户端发送了错误的请求。它需要是 CONNECT httpbin.org:443 HTTP/1.0,即只包含目标服务器的域名和端口号。考虑到标准的 Python 工具可以正确处理代理的 HTTPS,问题可能是由某些(未知的)自制代码发出了错误的代理请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接