Lun*_*Lun 7 go x509certificate
我开发了一个 NewRequestWithCert 函数,该函数创建新的soap.client并使用证书文件中的证书,并且在soap.client.Do之后它返回x509:无法验证证书,因为它不包含任何IP SAN。我的代码有什么问题吗?
func (o *Client) NewRequestWithCert(urlLink string, requestData interface{}, responseData interface{}, certName string, host string) error {
// Keep on client
o.requestData = &requestData
o.responseData = &responseData
o.url = urlLink
certByte, errCert := ioutil.ReadFile("/app/certificates/" + certName)
if errCert != nil {
logrus.Errorf("cert err: %v", errCert)
return errCert
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(certByte)
logrus.Debug("certByte : ", certByte)
tlsConfig := &tls.Config{
ServerName: host,
ClientCAs: caCertPool,
ClientAuth: tls.RequireAndVerifyClientCert,
}
// New http client
o.client = &http.Client{
Timeout: 30 * time.Second,
Transport: &http.Transport{
TLSClientConfig: tlsConfig,
},
}
// Make buffer
var requestDataBuffer bytes.Buffer
err := xml.NewEncoder(&requestDataBuffer).Encode(requestData)
logrus.Info("[ProxyRequest] URL: ", urlLink)
logrus.Info("[ProxyRequest] Data: ", requestDataBuffer.String())
// Build a new request, but not doing the POST yet
req, err := http.NewRequest("POST", urlLink, &requestDataBuffer)
if err != nil {
return err
}
// Keep on client
o.req = req
// Fill default header
o.fillHeader()
return nil
}
Run Code Online (Sandbox Code Playgroud)
服务器证书的主题与您在代码中使用的 URL 不匹配。具体来说,您可能使用了 URL 的 IP 地址,并且服务器证书不包含该 IP 地址的主题备用名称扩展 (SAN)(或任何其他 IP 地址,因此“不包含任何 IP SAN”)
造成这种不匹配的原因是您使用了错误的 URL 或服务器证书错误。