proxy --->伺服器在這種環境中,客戶端位於http代理後面,客戶端需要利用代理http隧道在"/> proxy --->伺服器在這種環境中,客戶端位於http代理後面,客戶端需要利用代理http隧道在">

首頁  >  文章  >  後端開發  >  如何透過 http 代理隧道發送 Client Hello

如何透過 http 代理隧道發送 Client Hello

王林
王林轉載
2024-02-12 18:06:15462瀏覽

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

問題內容

我有一個客戶端將與後端服務建立 tls 連線。

我遇到的情況有兩種。

  1. 直連網路:客戶端--->伺服器

    在這種環境下,客戶端直接連接到伺服器,如下程式碼。

var d tls.dialer
   //...
   d.config = &tls.config{
        //...
   }
   //...
   c1 := d.dial("tcp", addr)
  1. 代理網路:客戶端--->proxy--->伺服器

    在這種環境中,客戶端位於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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除