SOCKS5代理连接下HTTPS请求SSL握手失败问题求助
解决SOCKS5代理下HTTPS请求SSL握手失败的问题
针对你遇到的SSL Handshake failure问题,从代码逻辑和SOCKS5代理特性出发,有几个关键排查点和修复方案:
1. 检查SOCKS5代理的认证配置
你的代码中使用了空的socks.Auth{}结构体,如果目标SOCKS5代理要求用户名密码认证,会直接导致代理连接失败,后续TLS握手自然无法进行。
- 先确认代理是否需要认证,若需要,补充认证信息:
再将该auth := socks.Auth{ Username: "你的代理用户名", Password: "你的代理密码", }auth变量传入Connect方法中。
2. 补充TLS配置的ServerName字段
即使开启了InsecureSkipVerify: true,多数HTTPS服务器仍依赖SNI(服务器名称指示)来匹配对应证书,缺失该参数可能引发握手失败。
- 修改TLS配置,添加与目标域名一致的
ServerName:tlsConn := tls.Client(conn, &tls.Config{ InsecureSkipVerify: true, ServerName: "google.com", // 必须和目标域名一致 })
3. 先验证SOCKS5链路的有效性
可以先跳过TLS握手,尝试通过代理发送普通HTTP请求到目标服务器的80端口,确认代理链路是否能正常通信:
// 临时将目标端口改为80 target := socks.TargetCtx{ IP: "google.com", Port: 80, } // 连接后直接发送HTTP请求 if _, err := conn.Write([]byte("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n")); err != nil { log.Fatal(err) } // 读取响应,确认代理是否正常工作
修改后的完整代码示例
package main import ( "crypto/tls" "fmt" "io" "log" "time" "github.com/Pix4Devs/pix4lib/socks" ) func main() { proxy := socks.ProxyCtx{ IP: "185.199.229.156", Port: 7492, } target := socks.TargetCtx{ IP: "google.com", Port: 443, } // 若代理需要认证,取消注释并填充信息 auth := socks.Auth{} // auth.Username = "你的代理用户名" // auth.Password = "你的代理密码" conn, err := socks.NewSocks5Client(time.Second * 3).Connect(proxy, false, auth, target) if err != nil { log.Fatal(err) } defer conn.Close() tlsConn := tls.Client(conn, &tls.Config{ InsecureSkipVerify: true, ServerName: "google.com", // 添加SNI信息 }) if err := tlsConn.Handshake(); err != nil { log.Fatal(err) } request := []byte("GET / HTTP/1.1\r\nHost: google.com\r\nConnection: close\r\n\r\n") if _, err := tlsConn.Write(request); err != nil { log.Fatal(err) } reply := []byte{} buffer := make([]byte, 1024) for { n, err := tlsConn.Read(buffer) if err == io.EOF { break } if err != nil { log.Fatal(err) } reply = append(reply, buffer[:n]...) } fmt.Println(string(reply)) }
内容的提问来源于stack exchange,提问作者user22484832
相关产品推荐
相关产品推荐

