gpt4 book ai didi

go - TLS : Handshake Failure Using GoLang tls client

转载 作者:太空宇宙 更新时间:2023-11-03 13:49:21 33 4
gpt4 key购买 nike

我正在尝试使用 golang http/tsl 客户端通过 SSL/TLS 连接到服务器,这会导致“握手失败 (40)”错误,但出于某种原因,这个相同的端点可用于 CURL 命令。经过一些调试,我收集了以下数据。

Openssl command output Wireshark packets

client hello client hello 2 server hello Change Cipher Spec Handshake Failure

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,您似乎没有成功使用客户端证书。所以哪里有问题。

关于go - TLS : Handshake Failure Using GoLang tls client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58441421/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com