You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:42:33