x509:无法验证 <host ip> 的证书,因为它不包含任何 IP SAN

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)

Ste*_*ich 3

服务器证书的主题与您在代码中使用的 URL 不匹配。具体来说,您可能使用了 URL 的 IP 地址,并且服务器证书不包含该 IP 地址的主题备用名称扩展 (SAN)(或任何其他 IP 地址,因此“不包含任何 IP SAN”

造成这种不匹配的原因是您使用了错误的 URL 或服务器证书错误。