当前位置: > > > > TLS:使用 GoLang tls 客户端握手失败
TLS:使用 GoLang tls 客户端握手失败
来源:stackoverflow
2024-04-19 19:18:30
0浏览
收藏
Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《TLS:使用 GoLang tls 客户端握手失败》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!
问题内容
我正在尝试使用 golang http/tsl 客户端通过 ssl/tls 连接到服务器,这会导致“handshake faliure(40)”错误,但由于某种原因,同一端点适用于 curl 命令。经过一番调试,我收集到了以下数据。
func prepcerts(certmap map[string]string) (*http.transport, bool) {
ok := false
tlsconfig := &tls.config{}
if len(certmap["ca"]) > 0 {
cacert, err := ioutil.readfile(certmap["ca"])
fmt.println("cacert : ", cacert)
if err != nil {
log.fatal(err)
} else {
cacertpool := x509.newcertpool()
cacertpool.appendcertsfrompem(cacert)
(*tlsconfig).rootcas = cacertpool
ok = true
}
}
if len(certmap["cert"]) > 0 && len(certmap["key"]) > 0 {
cert, err := tls.loadx509keypair(certmap["cert"], certmap["key"])
fmt.println("cert : ", cert)
if err != nil {
log.fatal(err)
} else {
(*tlsconfig).certificates = []tls.certificate{cert}
ok = true
}
}
tlsconfig.buildnametocertificate()
return &http.transport{tlsclientconfig: tlsconfig}, ok
}
使用上述函数的代码
client := &http.Client{
Timeout: timeout,
}
//certMap = map[string]string{
// ca : "filelocation",
// cert : "filelocation",
// key " "filelocation",
//}
if transport, ok := PrepCerts(certMap); ok {
(*client).Transport = transport
}
resp, err := client.Do(req)
解决方案
从捕获的数据包中可以看出,服务器正在向客户端请求证书(Certificate Request)。从问题中包含的详细图像还可以看出,客户端没有发送任何证书(Certificate 记录,Certificate Length 0)。
还可以看到,在客户端发送(可能为空)证书后,服务器会发出警报,因此它可能不喜欢客户端发送的内容。因此,这肯定不是同意密码的问题(服务器已经同意密码),也不是客户端不喜欢服务器证书的问题(警报是由服务器而不是客户端发送的)。
根据您的代码,您正在尝试使用客户端证书执行某些操作,但根据 pcap,您似乎没有成功使用客户端证书。所以某个地方有问题。
今天关于《TLS:使用 GoLang tls 客户端握手失败》的内容介绍就到此结束,如果有什么疑问或者建议,可以在米云公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
