【问题标题】:How to do a https request with proxy如何使用代理进行 https 请求
【发布时间】:2017-07-28 11:48:10
【问题描述】:

我可以在不设置代理的情况下执行 http 或 https 客户端请求,

enter code here
tr := &http.Transport{
    TLSClientConfig: &tls.Config{InsecureSkipVerify: true},     
}

client := &http.Client{}
client.Transport = tr

request, err := http.NewRequest("HEAD", "http://www.???.com", nil)
request.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36")

resp, err := client.Do(request)

if err != nil {
    log.Fatalln(err)
    return
}
defer resp.Body.Close()

httpcode = resp.Status

这个脚本工作正常,当我请求 https url 时得到 200 ok,但是如果我设置代理,脚本:

proxyString := "https://47.91.179.xxx:443"
proxyUrl, _ := url.Parse(proxyString)

tr := &http.Transport{
    Proxy: http.ProxyURL(proxyUrl),
    TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, 
    
}

client := &http.Client{}
client.Transport = tr

....................

我总是收到“错误请求”,我阅读了文档:https://golang.org/pkg/net/http/:

............ 从 Go 1.6 开始,http 包在使用 HTTPS 时对 HTTP/2 协议具有透明支持。必须禁用 HTTP/2 的程序可以通过将 Transport.TLSNextProto(用于客户端)或 Server.TLSNextProto(用于服务器)设置为非零的空映射来实现。或者,当前支持以下 GODEBUG 环境变量: .....

所以,我尝试停止 http2:

tr := &http.Transport{
    Proxy: http.ProxyURL(proxyUrl),
    //Proxy: http.ProxyFromEnvironment,
    TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    TLSNextProto:    make(map[string]func(authority string, c *tls.Conn) http.RoundTripper),
}

同样的问题,“错误请求”。我试过 os.Setenv("HTTPS_PROXY", "47.91.???.???:443"),结果是一样的。 这是登录服务器:

{S;}220.255.95.68{S;}-{S;}07/Mar/2017:17:01:47 +0800{S;}CONNECT www.panpacific.com:443 HTTP/1.1{S;}400{S;}173{S;}340{S;}-{S;}-{S;}-{S;}-{S;}-{S;}www.panpacific.com

那么,golang 是否支持通过代理的 https 客户端请求?如何获得正确的结果?

【问题讨论】:

  • 我针对我的代理服务器测试了您的代码,它运行良好。这可能是您的代理的配置问题。您是否尝试过使用带有此代理的普通网络浏览器?
  • 嗨,IanB 你的代理服务器是什么?我使用 nginx(反向代理)。你是否使用 [TLSNextProto] 来停止 http2?
  • 我使用 Squid 代理。不,我没有指定 TLSNextProto。反向代理不应要求客户端使用任何特殊代理配置,即它应该是透明的
  • 标题重复:How to program Go to use a proxy?,但不是同一个问题。
  • 我很确定问题出在代理 URL 上。具体来说,代理必须使用 HTTP 协议访问,并且您指定 HTTPS。

标签: go https proxy


【解决方案1】:

您的Client.Transport.Proxy 配置似乎没有任何问题。两种尝试的方法(ProxyURLProxyFromEnvironment)都可以很好地指定 forward proxy

相关问题:How to program Go to use a proxy?

需要注意但不太可能的是,随后的客户端调用不会以某种方式绕过WriteProxy 的使用,而是直接调用Write——因为这会破坏代理规范。


鉴于此处提供的信息,“错误请求”可能表明您正在访问代理,但它作为通用 HTTP/HTTPS 转发代理无法正常工作,这是 Client.Transport.Proxy 将指定的。

也许会在此处添加一些清晰度:How to use Nginx as a HTTP/HTTPS proxy server?。总之,NGINX 通常不用作转发代理,所以也许这不是你想要做的。

如果您尝试将 NGINX 用作反向代理,那么配置是服务器端的问题,您的客户端不需要特殊的代理配置 - 只需将您的请求 URL 更改为指向代理即可。 em>


旁注:如果没有另外指定,&http.Client{} 将使用自动包含ProxyFromEnvironmentDefaultTransport,因此只有在构建非默认传输时才需要额外的代理配置(如问题中所做的那样为了指定InsecureSkipVerify) 或者你想要一个特定于应用程序的代理配置。 而且,重复一遍,客户端代理配置仅在使用转发代理时才需要。

【讨论】:

猜你喜欢
  • 2011-02-22
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2021-10-27
相关资源
最近更新 更多