Как сделать прокси и TLS в golang - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь направить свои запросы через прокси, а также отправляю cert.pem в конфигурации TLS. Ниже код выдает эту ошибку - proxyconnect tcp: tls: первая запись не похожа на рукопожатие TLS . Когда я меняю URL прокси с https на HTTP, работает тот же код. Однако URL прокси с https работает в python. Ниже мой код пока что

certs := x509.NewCertPool()
pemFile, err := ioutil.ReadFile("cert.pem")
if err != nil {
    return
}
certs.AppendCertsFromPEM(pemFile)
tlsConfig := &tls.Config{
    RootCAs: certs,
}

proxyUrl, err := url.Parse("https://someproxyurlhere.com:8080")
if err != nil {
    return
}

t := &http.Transport{
    TLSClientConfig: tlsConfig,
    Proxy:           http.ProxyURL(proxyUrl),
}

client := http.Client{
    Transport: t,
}

reqBody := "some JSON body here"

buff, err := json.Marshal(reqBody)
if err != nil {
    return
}

req, err := http.NewRequest(http.MethodPost, "https://someurlhere.com", bytes.NewBuffer(buff))
if err != nil {
    return
}

res, err := client.Do(req)
if err != nil {
    // Error here - proxyconnect tcp: tls: first record does not look like a TLS handshake
    return
}
defer res.Body.Close()

Python код

import requests
os.environ['HTTPS_PROXY'] = 'https://someproxyurlhere.com:8080'
response = requests.post("https://someurlhere.com",
                           json={'key': 'value'},
                           verify='cert.pem')
print(str(response.content))

1 Ответ

1 голос
/ 24 апреля 2020

Когда я изменяю URL-адрес прокси с https на HTTP, тот же код работает.

Это происходит потому, что вы используете HTTP-прокси, к которому должен обращаться HTTP, а не HTTPS даже для https://.. URL. Вот как обычно работает HTTPS-проксирование. Обратите внимание, что хотя теоретически прокси-сервер может прослушивать, если он получает обычное соединение или соединение TLS, на практике прокси-серверы (и серверы) используют разные порты для HTTP и HTTPS - таким образом, если он работает на одном порту с HTTP, он, скорее всего, не будет работать на тот же порт с HTTPS.

proxyconnect tcp: tls: первая запись не похожа на рукопожатие TLS.

Это происходит потому, что прокси-сервер отвечает с простой ошибкой HTTP на странный HTTP-запрос (который фактически является началом рукопожатия TLS).

Однако URL-адрес прокси-сервера с https работает в python.

Хотя выглядит так, что он работает на самом деле это не так. Python запросы будут по-прежнему использовать простой HTTP для прокси, даже если https:// был указан как URL.

Вы можете попытаться установить простое соединение TLS с самим прокси, например, с помощью Python или openssl s_client. Скорее всего, произойдет сбой с некоторой ошибкой рукопожатия, потому что прокси не ожидает TLS.

...