我有一個客戶端將與後端服務建立 tls 連線。
我遇到的情況有兩種。
在這種環境下,客戶端直接連接到伺服器,如下程式碼。
var d tls.dialer //... d.config = &tls.config{ //... } //... c1 := d.dial("tcp", addr)
在這種環境中,客戶端位於http代理後面,客戶端需要利用代理http隧道在客戶端和伺服器之間轉送流量。
我在客戶端使用golang.org/x/net/proxy
來連接代理,因為代理是http代理,客戶端應該使用net.dialer透過tcp連接代理。
dailer, err := proxy.FromURL(proxy, &net.Dialer{ Timeout: TCP_CONNECT_TIMEOUT, KeepAlive: TCP_KEEPALIVE_TIMEOUT, }) c2 := dailer.Dial("tcp", addr)
案例1,客戶端啟動tls連接,在網路流量資料包中,客戶端觸發tcp連接,經過3次握手,客戶端向伺服器發送client hello
。
在情況2中,客戶端首先使用tcp連接http代理(例如10.0.0.1:8080),接下來,發送connect
到代理,然後代理返回connectionestablished
,但是客戶端不發送client hello
到伺服器。
對於case2,我不知道如何以及在哪裡實現在客戶端發送client hello
?
提前致謝。
搜尋go doc後,找到了解決方案,希望對後來遇到類似問題的人有用。
在tls
中,有一個函數client,可以從現有網路建構。康恩,然後使用 握手
tlsConn := tls.Client(conn, &tls.Config{ Certificates: []tls.Certificate{*cert}, InsecureSkipVerify: true, ServerName: sni, ClientAuth: tls.RequestClientCert, }) err = tlsConn.Handshake()
以上是如何透過 http 代理隧道發送 Client Hello的詳細內容。更多資訊請關注PHP中文網其他相關文章!