Proxy - -->Server In dieser Umgebung befindet sich der Client hinter dem HTTP-Proxy und der Client muss den HTTP-Tunnel des Proxys nutzen"/> Proxy - -->Server In dieser Umgebung befindet sich der Client hinter dem HTTP-Proxy und der Client muss den HTTP-Tunnel des Proxys nutzen">

Heim >Backend-Entwicklung >Golang >So senden Sie Client Hello über einen HTTP-Proxy-Tunnel

So senden Sie Client Hello über einen HTTP-Proxy-Tunnel

王林
王林nach vorne
2024-02-12 18:06:15491Durchsuche

如何通过 http 代理隧道发送 Client Hello

Frageninhalt

Ich habe einen Client, der eine TLS-Verbindung zu einem Backend-Dienst aufbaut.

Es gibt zwei Situationen, denen ich begegnet bin.

  1. Direkte Verbindung zum Netzwerk: Client --->Server

    In dieser Umgebung stellt der Client eine direkte Verbindung zum Server her, wie im folgenden Code gezeigt.

var d tls.dialer
   //...
   d.config = &tls.config{
        //...
   }
   //...
   c1 := d.dial("tcp", addr)
  1. Proxy-Netzwerk: Client--->Proxy--->Server

    In dieser Umgebung befindet sich der Client hinter einem HTTP-Proxy und muss den Proxy-HTTP-Tunnel verwenden, um den Datenverkehr zwischen dem Client und dem Server weiterzuleiten.

    Ich verwende golang.org/x/net/proxy auf der Clientseite, um eine Verbindung zum Proxy herzustellen. Da es sich bei dem Proxy um einen HTTP-Proxy handelt, sollte der Client net.dialer verwenden, um über TCP eine Verbindung zum Proxy herzustellen.

dailer, err := proxy.FromURL(proxy, &net.Dialer{
        Timeout:   TCP_CONNECT_TIMEOUT,
        KeepAlive: TCP_KEEPALIVE_TIMEOUT,
    })
   c2 := dailer.Dial("tcp", addr)

Fall 1: Der Client startet die TLS-Verbindung. Im Netzwerkverkehrspaket löst der Client die TCP-Verbindung aus. Nach 3 Handshakes sendet der Client client hello an den Server.

In Fall 2 verwendet der Client zunächst TCP, um eine Verbindung zum HTTP-Proxy herzustellen (z. B. 10.0.0.1:8080), sendet dann connect an den Proxy und der Proxy gibt dann connectionestablished zurück , aber der Client sendet connect到代理,然后代理返回connectionestablished,但是客户端发送client hello an den Server.

Für Fall 2 weiß ich nicht, wie und wo ich den Versand auf der Clientseite umsetzen soll client hello?

Vielen Dank im Voraus.

Lösung

Nachdem ich go doc durchsucht habe, habe ich die Lösung gefunden. Ich hoffe, dass sie für Menschen nützlich sein wird, die später auf ähnliche Probleme stoßen.

In tls gibt es eine Funktion Client, die aus einem bestehenden Netzwerk aufgebaut werden kann. Conn, dann verwenden Sie Handshake

tlsConn := tls.Client(conn, &tls.Config{
    Certificates:       []tls.Certificate{*cert},
    InsecureSkipVerify: true,
    ServerName:         sni,
    ClientAuth:         tls.RequestClientCert,
})
err = tlsConn.Handshake()

Das obige ist der detaillierte Inhalt vonSo senden Sie Client Hello über einen HTTP-Proxy-Tunnel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen