Как можно получить пакет TLS ServerHello с использованием прокси?

  • 5 сентября 2023 г. 13:47
Ответы на вопрос 2
В вашем коде используется прямое непосредственное подключение к конечному серверу, а не через прокси, если я правильно понял ваш вопрос. Если вы хотите установить подключение через прокси, вам необходимо использовать соответствующую библиотеку или инструмент для настройки прокси-соединения.

Один из распространенных способов получить ServerHello через прокси - использовать библиотеку, например `http.Client` в Go, с настроенным прокси-соединением.

```go
package main

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

func main() {
    proxyURL, err := url.Parse("http://your-proxy-server:port")
    if err != nil {
        log.Fatal(err)
    }

    // Создание клиента с настройками прокси
    client := &http.Client{
        Transport: &http.Transport{
            Proxy: http.ProxyURL(proxyURL),
            DialTLS: func(network, addr string) (net.Conn, error) {
                conn, err := net.Dial(network, addr)
                if err != nil {
                    return nil, err
                }
                tlsConfig := &tls.Config{InsecureSkipVerify: true}
                tlsConn := tls.Client(conn, tlsConfig)
                if err := tlsConn.Handshake(); err != nil {
                    return nil, err
                }
                return tlsConn, nil
            },
        },
    }

    // Отправка запроса
    resp, err := client.Get("https://example.com")
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    // Получение ServerHello
    state := resp.TLS
    if state != nil {
        fmt.Println(state.ServerName)
    } else {
        fmt.Println("No TLS connection")
    }
}
```

В этом примере мы создаем `http.Client`, настраиваем его на использование прокси через `http.Transport`. Мы также настраиваем `DialTLS` функцию для поддержки TLS-соединений через указанный прокси. 

После отправки запроса `client.Get`, вы можете получить информацию о состоянии TLS-соединения через поле `resp.TLS`. Если есть активное соединение, вы можете получить доступ к `resp.TLS.ServerName` для получения имени сервера ServerHello.
Можно, но нужно настроить форвардинг трафика на уровне TCP вместо проксирования, чтобы избежать потенциальной возможности расшифровки HTTPS со стороны злоумышленника. Таким образом, любой доступ к промежуточным узлам в интернете не будет позволять прозрачно расшифровывать HTTPS. 
Похожие вопросы