亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 UTLS 和 HTTP 1.1 請求時通過代理連接

使用 UTLS 和 HTTP 1.1 請求時通過代理連接

Go
鴻蒙傳說 2023-08-14 17:32:16
我正在嘗試使用隨機 TLS 指紋識別連接到主機。我正在使用https://github.com/refraction-networking/utls(請參閱我在https://github.com/refraction-networking/utls/issues/42上創建的問題)我現在的問題是,在打開該連接時如何利用 HTTP 或 SOCKS5 代理?我現在使用的代碼是:package mainimport (    "bufio"    "fmt"    "log"    "net"    "net/http"    "net/http/httputil"    "net/url"    "time"    "github.com/refraction-networking/utls")var (    dialTimeout   = time.Duration(15) * time.Second)var requestHostname = "google.com"var requestAddr = "172.217.22.110:443"// this example generates a randomized fingeprint, then re-uses it in a follow-up connectionfunc HttpGetConsistentRandomized(hostname string, addr , uri string) (*http.Response, error) {    config := tls.Config{ServerName: hostname}    tcpConn, err := net.DialTimeout("tcp", addr, dialTimeout)    if err != nil {        return nil, fmt.Errorf("net.DialTimeout error: %+v", err)    }    uTlsConn := tls.UClient(tcpConn, &config, tls.HelloRandomized)    defer uTlsConn.Close()    err = uTlsConn.Handshake()    if err != nil {        return nil, fmt.Errorf("uTlsConn.Handshake() error: %+v", err)    }    uTlsConn.Close()    // At this point uTlsConn.ClientHelloID holds a seed that was used to generate    // randomized fingerprint. Now we can establish second connection with same fp    tcpConn2, err := net.DialTimeout("tcp", addr, dialTimeout)    if err != nil {        return nil, fmt.Errorf("net.DialTimeout error: %+v", err)    }    uTlsConn2 := tls.UClient(tcpConn2, &config, uTlsConn.ClientHelloID)    defer uTlsConn2.Close()    err = uTlsConn2.Handshake()    if err != nil {        return nil, fmt.Errorf("uTlsConn.Handshake() error: %+v", err)    }    return httpGetOverConn(uTlsConn2, uTlsConn2.HandshakeState.ServerHello.AlpnProtocol, uri)}
查看完整描述

2 回答

?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

您必須首先創建一個代理撥號器,撥打代理以創建 net.Conn,然后在握手之前創建 uTLS 客戶端時使用該 net.Conn。為了簡潔起見,您的自定義 dialTLS 函數將類似于:


import (

? ? "crypto/tls"

? ? "net"

? ? "net/url"? ??


? ? "github.com/magisterquis/connectproxy"

? ? "golang.org/x/net/proxy"

? ? utls "github.com/refraction-networking/utls"

)


var proxyString = "http://127.0.0.1:8080"

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

dialTLS := func(network, addr string, _ *tls.Config) (net.Conn, error) {

? ? proxyURI, _ := url.Parse(proxyString)


? ? switch proxyURI.Scheme {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? case "socks5":? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? proxyDialer, err = proxy.SOCKS5("tcp", proxyString, nil, proxy.Direct)

? ? case "http":? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? proxyDialer, err = connectproxy.New(proxyURI, proxy.Direct)? ? ? ? ? ??

? ? }? ?


? ? conn, err := proxyDialer.Dial("tcp", addr)

? ? uconn := utls.UClient(conn, cfg, &utls.HelloRandomizedALPN)?


? ? ...

}?


查看完整回答
反對 回復 2023-08-14
?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

HTTP 代理和 SOCKS 代理的工作原理是在 TCP 連接后進行一些初始代理特定握手。握手完成后,它們會提供一個普通的 TCP 套接字,然后可用于進行 TLS 握手等。因此,您所需要做的就是替換您的

tcpConn,?err?:=?net.DialTimeout("tcp",?addr,?dialTimeout)

使用代理特定方法來設置 TCP 連接。這可以通過使用SOCKS5創建適當的撥號器或使用 HTTP CONNECT 方法在connectproxyx/net/proxy中完成類似的操作來完成。


查看完整回答
反對 回復 2023-08-14
  • 2 回答
  • 0 關注
  • 351 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號