通过Socks5进行HTTP GET请求 | EOF错误

3

我想做什么:
构建一个包(以备后用),提供一种方法通过给定的socks5代理执行对任何页面的get请求。

我的问题:
每当我尝试使用SSL (https)请求页面时,就会出现以下错误:

执行请求Get https://www.xxxxxxx.com时出错:socks连接tcp 83.234.8.214:4145->www.xxxxxxx.com:443: EOF

然而,使用http://www.google.com请求是正常的。所以SSL连接肯定有问题。我不知道为什么这不起作用,因为我对SSL连接经验不是很丰富。文件结束对我来说没有意义。

我的当前代码:

func main() {
    // public socks5 - worked when I created this question
    proxy_addr := "83.234.8.214:4145"

    // With this address I get the error
    web_addr := "https://www.whatismyip.com"

    // Requesting google works fine
    //web_addr := "http://www.google.com"

    dialer, err := proxy.SOCKS5("tcp", proxy_addr, nil, proxy.Direct)
    handleError(err, "error creating dialer")

    httpTransport := &http.Transport{}
    httpClient := &http.Client{Transport: httpTransport}

    httpTransport.DialTLS = dialer.Dial

    req, err := http.NewRequest("GET", web_addr, nil)
    handleError(err, "error creating request")

    httpClient.Timeout = 5 * time.Second

    resp, err := httpClient.Do(req)
    handleError(err, "error executing request")

    defer resp.Body.Close()
    b, err := ioutil.ReadAll(resp.Body)
    handleError(err, "error reading body")

    fmt.Println(string(b))
}

func handleError(err error, msg string) {
    if err != nil {
        log.Fatal(err)
    }
}

那么我在处理ssl连接方面缺少什么?

非常感谢。


编辑1:

如果有人认为这是whatismyip.com的问题,我已经进行了更多测试:


它在谷歌上运行良好,因为您为谷歌设置的URL使用的是http而不是https。我已经尝试过使用您的代码和https://www.google.com,但也无法正常工作... - math2001
@math2001好的,这也是我在问题中提出的。核心问题在于“为什么”和“如何处理https”。 - C4d
这意味着SOCKS服务器在未发送任何内容的情况下断开了连接。请检查其日志以找出原因。 - Michael Hampton
@MichaelHampton "whatismyip.com" 不是我的网站,所以我无法检查他们的日志。此外,该网站并不是唯一一个出现错误的网站。事实上,在使用 SSL 的任何地方都会发生这种情况。 - C4d
你是在自己的SOCKS服务器上运行这个程序,对吧?当我运行你粘贴的代码时,我得到了一个有趣的Web服务器错误消息,其中一部分内容为:<head><title>400 The plain HTTP request was sent to HTTPS port</title></head> - Michael Hampton
显示剩余3条评论
1个回答

2

你的程序与socks5代理之间的连接不通过SSL/TLS。

因此,您应该更改以下行:
httpTransport.DialTLS = dialer.Dial

httpTransport.Dial = dialer.Dial

我检查了https://www.whatismyip.comhttps://www.google.com。URL被成功下载。
为了测试,我在我的服务器上设置了3proxy服务,使用已修复的行测试您的代码并检查3proxy日志。

所有请求都在代理服务器日志中。

如果您需要更多帮助,请告诉我,我会帮忙。


注意事项:

  • Socks5代理需要支持SSL连接。
  • 问题中的代码将无法与此答案一起使用,因为代理(代码中使用的)不支持SSL连接。

我已经编辑并添加了自己的研究。不幸的是,您要么没有使用您的解决方案测试我的代码,要么就没有对为什么我的评论与您的解决方案仍然无法正常工作进行任何评论。我的编辑应该可以澄清这一点。我选择了另一个代理79.106.133.123:1080,请求突然按预期工作了。 - C4d
还要注意httpTransport.Dial已经被弃用。我不知道应该如何处理,所以我把这个问题留给你来说一些关于它的事情(如果你知道的话)。除了这两个评论,我的问题已经解决了。非常感谢! - C4d
我在测试中使用了3proxy,如果需要,我可以发送完整的代码+/etc/3proxy.cfg。 - Evgeny A. Mamonov

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