Golang证书验证

时间:2017-12-09 23:01:13

标签: ssl go cryptography x509

我使用Go通过自定义根CA执行HTTPS请求。根CA是我唯一拥有的证书。

我的代码如下所示:

// performRequest sets up the HTTPS Client we'll use for communication and handle the actual requesting to the external
// end point. It is used by the auth and collect adapters who set their response data up first.
func performRequest(rawData []byte, soapHeader string) (*http.Response, error) {
  conf := config.GetConfig()

  // Set up the certificate handler and the HTTP client.
  certPool := x509.NewCertPool()
  certPool.AppendCertsFromPEM(certificate)
  client := &http.Client{
    Transport: &http.Transport{
      TLSClientConfig: &tls.Config{
        RootCAs:            certPool,
        InsecureSkipVerify: false,
      },
    },
  }

  req, err := http.NewRequest(http.MethodPost, baseURL, bytes.NewBuffer(rawData))
  if err != nil {
    return nil, err
  }

  // Sets the SOAPAction and Content-Type headers to the request.
  req.Header.Set("SOAPAction", soapHeader)
  req.Header.Set("Content-Type", "text/xml; charset=UTF-8")

  // Send request as our custom client, return response
  return client.Do(req)
}

我得到的错误是:

2017/12/09 21:06:13 Post https://secure.site: x509: certificate is not valid for any names, but wanted to match secure.site

我一直无法确切地知道原因是什么。在检查CA证书的SAN时,我没有secure.site(根本没有名称,因为错误说明了),但我不知道我是怎么做的这是错的。

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:3)

你需要做两件事:

  1. 在服务器端添加CA证书,CA需要为所有各方所知。
  2. 在服务器上生成并使用服务器证书(证书中包含主机名)。服务器证书需要由CA签名。
  3. 您可以在here(第一个谷歌示例)

    中找到相关示例

    编辑:澄清一下,错误是由于您尝试安全连接到远程主机。默认情况下,go客户端将查找服务器返回的有效证书。

    有效手段(除其他外):

    1. 由已知的CA签名
    2. 它包含http.NewRequestCommonName字段中服务器的ip / dns(您传递给Subject Alternative Name: DNS/IP的那个)。
    3. 最终修改

      服务器证书包含设置为服务器主机名的正确Common Name,但它还包含设置为电子邮件地址的Subject Alternative Name

      https://groups.google.com/a/chromium.org/forum/#!topic/security-dev/IGT2fLJrAeo中所述,如果找到SAN,Go现在忽略Common Name