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

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

王林
發布: 2024-02-12 18:06:15
轉載
497 人瀏覽過

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

問題內容

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

我遇到的情況有兩種。

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

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

var d tls.dialer
   //...
   d.config = &tls.config{
        //...
   }
   //...
   c1 := d.dial("tcp", addr)
登入後複製
  • 代理網路:客戶端--->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
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板