Ошибки проверки и игнорирования сертификатов при работе через прокси в Golang
Пишу скрипт на GO который проверяет прокси низкого качества путем выполнения GET запроса. Однако возникают ошибки с проверкой и игнорированием проверки сертификатов. Независимо к какому сайту выполняется запрос, ошибка сохраняется (сайт в коде для примера, пробовал и гугл и тд.).
import (
"crypto/tls"
"fmt"
"io"
"net"
"net/http"
"net/url"
"os"
"strings"
"time"
)
/* ... */
func main() {
proxyList, err := readProxyFile("https.txt")
if err != nil {
fmt.Println("Error reading proxy file:", err)
return
}
for _, proxyStr := range proxyList {
proxyURL, err := url.Parse("https://" + proxyStr)
if err != nil {
fmt.Println("Error parsing proxy URL:", err)
continue
}
httpTransport := &http.Transport{
Proxy: http.ProxyURL(proxyURL),
DialContext: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).DialContext,
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // Отключение проверки сертификатов
}
httpClient := &http.Client{
Transport: httpTransport,
}
req, err := http.NewRequest("GET", "https://httpbin.org/get", nil)
if err != nil {
fmt.Println("Error creating request:", err)
continue
}
resp, err := httpClient.Do(req)
if err != nil {
fmt.Println("Error making request with proxy", proxyStr, ":", err)
continue
}
fmt.Println("Proxy", proxyStr, "is working.")
defer resp.Body.Close()
err = saveResponseToFile(resp.Body, "response.html")
if err != nil {
fmt.Println("Error writing response to file:", err)
continue
}
}
}
Если включена проверка сертификатов TLSClientConfig: &tls.Config{InsecureSkipVerify: true}
возникают следующие ошибки:
Error proxy 45.82.179.153:33354 : Get "https://httpbin.org/get": proxyconnect tcp: dial tcp 45.82.179.153:33354: connectex: No connection could be made because the target machine actively refused it.
Error proxy 3.127.62.252:80 : Get "https://httpbin.org/get": local error: tls: bad record MAC
Error proxy 52.16.232.164:3128 : Get "https://httpbin.org/get": local error: tls: bad record MAC
Error proxy 13.38.176.104:3128 : Get "https://httpbin.org/get": local error: tls: bad record MAC
Error proxy 44.204.37.158:8081 : Get "https://httpbin.org/get": local error: tls: bad record MAC
Error proxy 3.96.173.26:59878 : Get "https://httpbin.org/get": local error: tls: bad record MAC
Error proxy 20.111.54.16:80 : Get "https://httpbin.org/get": proxyconnect tcp: tls: first record does not look like a TLS handshake
Error proxy 20.111.54.16:8123 : Get "https://httpbin.org/get": proxyconnect tcp: tls: first record does not look like a TLS handshake
Если отключена проверка сертификатов TLSClientConfig: &tls.Config{InsecureSkipVerify: false}
возникают следующие ошибки:
Error proxy 45.82.179.153:33354 : Get "https://httpbin.org/get": proxyconnect tcp: dial tcp 45.82.179.153:33354: connectex: No connection could be made because the target machine actively refused it.
Error proxy 3.127.62.252:80 : Get "https://httpbin.org/get": tls: failed to verify certificate: x509: certificate signed by unknown authority
Error proxy 52.16.232.164:3128 : Get "https://httpbin.org/get": tls: failed to verify certificate: x509: certificate signed by unknown authority
Error proxy 13.38.176.104:3128 : Get "https://httpbin.org/get": tls: failed to verify certificate: x509: certificate signed by unknown authority
Error proxy 44.204.37.158:8081 : Get "https://httpbin.org/get": tls: failed to verify certificate: x509: certificate signed by unknown authority
Error proxy 3.96.173.26:59878 : Get "https://httpbin.org/get": tls: failed to verify certificate: x509: certificate signed by unknown authority
Моя цель реализовать нормальную обработку исключений при работе с прокси, однако из-за этой проблемы с сертификатами не могу продолжить свой основной проект где и хотел реализовать работу с прокси.
Мне по сути без разницы будет ли проводиться проверка сертификатов (скрипт пишу для себя), главное что бы можно было нормально работать с прокси и выполнять запросы.
Вполне вероятно, что проблема связанна с прокси, однако тогда при отключенной проверке сертификатов запросы должны проходить нормально, но увы этого не происходит.
В данный момент я не нашел как не проводить проверку сертификатов и выполнять запрос через прокси или же как их проверять без ошибок. Я уже пробовал следующие с тем же результатом:
- Получал копию пула системных сертификатов
x509.SystemCertPool()
и определял набор корневых сертификатов в tls.ConfighttpTransport.TLSClientConfig = &tls.Config{RootCAs:x509.NewCertPool()}
- Добавлял клиентский сертификат сайта в копию пула системных сертификатов
- Использовал не стандартный пакет для отправки запросов
github.com/go-resty/resty/v2
иgolang.org/x/net/proxy
- Выполнял запросы на десяток разных сайтов.
- Запускал скрипт на: виртуалке windows, другом пк Еще на стаке нашел как включали игнорирование следующим образом (то же не помогло):
insecureSSLCustom := flag.Bool("insecure-ssl", true, "Accept/Ignore all server SSL certificates")
flag.Parse()
config := &tls.Config{
InsecureSkipVerify: *insecureSSLCustom,
RootCAs: rootCAs,
}
Использую:
- go 1.21.3
- Windows 11, Windows 10
- Тип прокси HTTPS без авторизации