Golang http客户端握手失败

Nik*_*lay 3 ssl https go handshake

尝试获取网页:

    tr := &http.Transport{
        TLSHandshakeTimeout: 30 * time.Second,
        DisableKeepAlives: true,
    }

    client := &http.Client{Transport: tr}

    req, err := http.NewRequest("GET", "https://www.fl.ru/", nil)
    if err != nil {
        log.Fatalf("%s\n", err);
    }

    resp, err := client.Do(req);
    if err != nil {
        log.Fatalf("%s\n", err);
    }
    defer resp.Body.Close()
Run Code Online (Sandbox Code Playgroud)

获取https://www.fl.ru/:远程错误:握手失败.

如果我尝试获取另一个HTTPS页面 - 一切正常.

Jim*_*imB 7

该服务器仅支持一些弱密码:

TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x39)   DH 1024 bits (p: 128, g: 1, Ys: 128)   FS   WEAK
TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x33)   DH 1024 bits (p: 128, g: 1, Ys: 128)   FS   WEAK
TLS_RSA_WITH_RC4_128_SHA (0x5)   WEAK
Run Code Online (Sandbox Code Playgroud)

如果您确实必须连接到该服务器,Go会支持列表中的最后一个密码,但默认情况下不支持.使用新的tls.Config创建一个客户端,指定所需的密码:

t := &http.Transport{
    Proxy: http.ProxyFromEnvironment,
    Dial: (&net.Dialer{
        Timeout:   30 * time.Second,
        KeepAlive: 30 * time.Second,
    }).Dial,
    TLSHandshakeTimeout: 10 * time.Second,
    TLSClientConfig: &tls.Config{
        CipherSuites: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA},
    },
}
Run Code Online (Sandbox Code Playgroud)

  • @ Ainar-G:RC4已被禁用,因为它非常弱,现在被禁止:https://tools.ietf.org/html/rfc7465. (2认同)
  • @ Ainar-G:重新调试; 握手失败的一个常见原因是当没有共享密码时,所以我查看服务器支持的内容,并检查那些使用crypto/tls中定义的常量.(我还检查服务器是否支持tls1.1,tls1.2等等.现在Go1.5对于行为不端的服务器有所好转,所以它往往更宽容) (2认同)
  • @Nikolay:最简单的方法是https://www.ssllabs.com/。您还可以使用任何 tls 客户端编写脚本,以及此处提到的一些其他方法:http://superuser.com/questions/109213/how-do-i-list-the-ssl-tls-cipher-suites-a-pspecial -网站优惠, (2认同)