【问题标题】:Golang http client handshake failureGolang http客户端握手失败
【发布时间】:2015-12-08 00:26:05
【问题描述】:

尝试获取网页:

    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()

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

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

【问题讨论】:

  • @Ainar-G 是的,它的 1.5

标签: ssl go https handshake


【解决方案1】:

该服务器仅支持少数弱密码:

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

如果您确实必须连接到该服务器,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},
    },
}

【讨论】:

  • 这很酷。你能分享一下你是如何调试的吗?另外,知道为什么它可能在 1.4.2 中工作并在 1.5 中崩溃吗?
  • @Ainar-G:RC4 已被禁用,因为它非常弱,现在被禁止:tools.ietf.org/html/rfc7465
  • @Ainar-G:重新调试;握手失败的一个常见原因是没有共享密码,所以我查找了服务器支持的内容,并使用 crypto/tls 中定义的常量检查了这些内容。 (我还检查了服务器是否甚至支持 tls1.1、tls1.2 等。Go1.5 现在在回退到行为不端的服务器方面要好一些,所以它往往更宽容)
  • @JimB 谢谢!正是需要的。如何查看支持的协议?
  • @Nikolay:最简单的方法是ssllabs.com。您还可以使用任何 tls 客户端编写脚本,以及此处提到的其他一些方法:superuser.com/questions/109213/…,
猜你喜欢
  • 2020-02-14
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 2016-01-18
  • 2019-02-28
  • 2016-09-23
相关资源
最近更新 更多