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
Ich habe einen Client, der eine TLS-Verbindung zu einem Backend-Dienst aufbaut.
Es gibt zwei Situationen, denen ich begegnet bin.
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)
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.
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!