使用基本身份验证通过HTTP代理访问HTTPS

时间:2016-11-26 11:16:51

标签: authentication go https proxy

我正在尝试使用具有用户名/密码授权的代理对HTTPS URL发出List<String> CheckedNames(System.Windows.Forms.TreeNodeCollection theNodes) { List<String> aResult = new List<String>(); if (theNodes != null) { foreach (System.Windows.Forms.TreeNode aNode in theNodes) { if (aNode.Checked) { string[] itemName = Regex.Split(aNode.Text, " - "); aResult.Add(itemName[0]); } aResult.AddRange(CheckedNames(aNode.Nodes)); } } return aResult; } 请求(代理需要auth,而不是网站)。 这是我的所作所为:

GET

问题是,当我尝试向HTTP(而不是HTTPS)站点发出请求时,它可以正常运行,但是如果我发出HTTPS请求则会失败(请参阅上面的消息)。

我用我的浏览器(FireFox)测试了代理,一切顺利,我通过firebug查找了标题,并添加了与请求相关的所有内容(上图)。我已经对package main import ( "crypto/tls" "encoding/base64" "fmt" "net/http" "net/http/httputil" "net/url" ) func main() { ua := "Mozilla/5.0 (Windows NT 6.1" basic := "Basic " + base64.StdEncoding.EncodeToString([]byte("username:mypass")) req, err := http.NewRequest("GET", "https://api.ipify.org/", nil) proxyUrl, _ := url.Parse("http://myproxy.com:9999") fmt.Println(basic) // Basic dXNlcm5hbWU6bXlwYXNz req.Header.Add("Proxy-Authorization", basic) req.Header.Add("User-Agent", ua) bb, _ := httputil.DumpRequest(req, false) fmt.Println(string(bb)) /* Get / HTTP/1.1 Host: api.ipify.org Proxy-Authorization: Basic dXNlcm5hbWU6bXlwYXNz User-Agent: Mozilla/5.0 (Windows NT 6.1 */ client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, Proxy: http.ProxyURL(proxyUrl), }, } resp, err := client.Do(req) fmt.Println(err) // Proxy Authentication Required fmt.Println(resp) // <nil> } 值和其他所有值进行了三倍检查,但没有任何运气。

那么有人知道为什么会这样,或者至少我如何研究这个问题?

要添加的最后一件事是我可以在这种情况下使用公共HTTP代理(不需要任何身份验证),并且在auth进入此过程时似乎会出现问题(错误也表明)。

P.S。不幸的是,我无法共享代理IP,端口和用户名,因为它违反了他们的政策。

1 个答案:

答案 0 :(得分:3)

package main

import (
    "crypto/tls"
    "fmt"
    "net/url"
    "net/http"
)

func main() {
    req, err := http.NewRequest("GET", "https://api.ipify.org/", nil)
    proxyUrl, _ := url.Parse("http://username:password@127.0.0.1:9999")
    client := &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
            Proxy:           http.ProxyURL(proxyUrl),
        },
    }
    _, err = client.Do(req)
    fmt.Println(err)
}