gpt4 book ai didi

http - 使用UTLS和HTTP 1.1请求时通过代理连接

转载 作者:行者123 更新时间:2023-12-01 22:24:55 30 4
gpt4 key购买 nike

我正在尝试使用随机TLS指纹连接到主机。我正在使用https://github.com/refraction-networking/utls(请参阅我在https://github.com/refraction-networking/utls/issues/42上创建的问题)

现在的问题是,在打开该连接时如何使用HTTP或SOCKS5代理?

我现在使用的代码是:

package main

import (
"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 connection
func 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)
}

func main() {
var response *http.Response
var err error

response, err = HttpGetConsistentRandomized(requestHostname, requestAddr, "/2.0/ssocookie")
if err != nil {
fmt.Printf("#> HttpGetConsistentRandomized() failed: %+v\n", err)
} else {
//fmt.Printf("#> HttpGetConsistentRandomized() response: %+s\n", httputil.DumpResponse(response,true))
dump, err := httputil.DumpResponse(response, true)
if err != nil {
log.Fatal(err)
}

fmt.Printf("%+s\n", dump)
}
return
}

func httpGetOverConn(conn net.Conn, alpn string, uri string) (*http.Response, error) {

req := &http.Request{
Method: "GET",
URL: &url.URL{Host: "www." + requestHostname + uri},
Header: make(http.Header),
Host: "www." + requestHostname,
}

req.Proto = "HTTP/1.1"
req.ProtoMajor = 1
req.ProtoMinor = 1

err := req.Write(conn)
if err != nil {
return nil, err
}
return http.ReadResponse(bufio.NewReader(conn), req)
}

最佳答案

在TCP连接之后,HTTP代理和SOCKS代理将进行一些特定于代理的初始握手。握手完成后,它们会提供一个普通的TCP套接字,然后可将其用于TLS握手等。因此,您所需要做的就是更换您的

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

使用特定于代理的方法来设置TCP连接。这可以通过在 x/net/proxy中使用 SOCKS5创建适当的Dialer来完成,或者使用HTTP CONNECT方法在 connectproxy中完成。

关于http - 使用UTLS和HTTP 1.1请求时通过代理连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60624954/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com