Go HTTPS客户端问题 - 远程错误:TLS握手失败

8
我遇到了错误“远程错误:TLS握手失败”:
~/go/bin/aci-tls 10.0.0.201 user pass
2016/12/20 18:12:04 post error: Post https://10.0.0.201/api/aaaLogin.json: remote error: tls: handshake failure

以下是基本的HTTPS客户端代码:https://play.golang.org/p/cqPT0oR__q

此HTTPS服务器可以正常使用OpenSSL:

$ openssl s_client -connect 10.0.0.201:443

(snip)
SSL handshake has read 1383 bytes and written 431 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
(snip)

测试环境:

$ go version
go version go1.7.4 linux/386

C:\>go version
go version go1.7.4 windows/amd64

gotlsscan 说:

lab@ubu:~$ go version
go version go1.8beta2 linux/386
lab@ubu:~$ ~/go/bin/gotlsscan -host 10.0.0.201 | grep -v NOT
Testing SSL30 (DISABLED)
Testing TLS1.0
Testing TLS1.1
Testing TLS1.2
lab@ubu:~$
lab@ubu:~$ ~/go/bin/gotlsscan -insecure -host 10.0.0.201 | grep -v NOT
Testing SSL30 (DISABLED)
Testing TLS1.0
Testing TLS1.1
        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA            [OK]
        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA            [OK]
Testing TLS1.2

我该如何进一步排查此问题?

1
你使用的Go版本是什么?服务器是什么,你能获取任何描述连接失败原因的日志吗? - JimB
go version go1.7.4 linux/386,服务器是Cisco APIC,尚未找到与HTTPS相关的日志记录。 - Everton
2
你可以尝试运行 github.com/jbardin/gotlsscan 对主机进行扫描(需要 >go1.8beta,或从 master 构建 Go)。它将运行所有 tls 版本和密码套件,并列出兼容的内容。服务器可能存在一些错误,但不同的密码套件或 tls 版本仍然可以正常工作(IIS 也曾经在 tls1.2 握手时出现过问题)。 - JimB
@JimB 我已经将gotlsscan的结果添加到问题中。 - Everton
1
这表明它确实与 VersionTLS11TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 进行了成功的握手,因此我会配置客户端使用这些设置。 - JimB
@JimB 太好了!这个可以运行: https://play.golang.org/p/oMrFigx-PT 把它作为答案贴出来,这样我就可以接受它了! :-) - Everton
1个回答

6

由于某些原因,服务器不接受TLS1.2握手,也没有正确回退到TLS1.1。您可以强制客户端仅使用TLS1.1和兼容的密码套件,方法如下:

cfg := &tls.Config{
    CipherSuites: []uint16{
        tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
        tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
    },
    PreferServerCipherSuites: true,
    InsecureSkipVerify:       true,
    MinVersion:               tls.VersionTLS11,
    MaxVersion:               tls.VersionTLS11,
}

如果您正在使用路由器或WiFi接入点,请重新启动它。问题可能有很多原因,这在我的情况下就是其中之一。 - Alan Corey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接