我试图了解双向 TLS 的工作原理,我有以下示例:
我有一个客户端想要连接到服务器“svc1.example.com”
但服务器有一个
服务器证书的通用名称为“svc1.example.cloud”,SAN 为“svc.example.test.cloud”。
现在,当我发出 GET 请求时,我得到以下信息:
x509:证书对 svc.example.test.cloud 有效,对 svc1.example.com 无效。
所以,我的问题是我应该对 TLS clientConfig 进行更改以包含服务器名吗?或者我应该在 TLS 客户端配置中添加自定义 verifyPeerCertificate 函数,如下所示?
请让我知道 Servername 应该是什么以及我应该在 verifyPeerCertificate 函数中检查什么。
func customverify(customCName func(*x509.Certificate) bool) func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {
if customCName == nil {
return nil
}
return func(_ [][]byte, verifiedChains [][]*x509.Certificate) error {
for _, certs := range verifiedChains {
leaf := certs[0]
if customCName(leaf) {
return nil
}
}
return fmt.Errorf("client identity verification failed")
}
}
func configureClient(certFile, keyFile string) (*http.Client, error) {
certpool, err := addRootCA()
if err != nil {
return nil, err
}
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
if err != nil {
return nil, err
}
transport := ytls.NewClientTransport()
transport.TLSClientConfig.Certificates = []tls.Certificate{cert}
transport.TLSClientConfig.RootCAs = certpool
//transport.TLSClientConfig.ServerName = expectedCName
transport.TLSClientConfig.VerifyPeerCertificate = customverify(func(cert *x509.Certificate) bool {
return cert.Subject.CommonName == "svc1.example.cloud"
})
httpClient := &http.Client{Transport: transport}
return httpClient, nil
}
DIEA
相关分类