Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssl Golang证书验证_Ssl_Go_Cryptography_X509 - Fatal编程技术网

Ssl Golang证书验证

Ssl Golang证书验证,ssl,go,cryptography,x509,Ssl,Go,Cryptography,X509,我使用Go来执行带有自定义根CA的HTTPS请求。根CA是我这边唯一的证书 我的代码如下所示: //performRequest设置我们将用于通信的HTTPS客户端,并处理对外部服务器的实际请求 //终点。它由首先设置响应数据的身份验证和收集适配器使用。 func performRequest(rawData[]字节,soapHeader字符串)(*http.Response,error){ conf:=config.GetConfig() //设置证书处理程序和HTTP客户端。 certPoo

我使用Go来执行带有自定义根CA的HTTPS请求。根CA是我这边唯一的证书

我的代码如下所示:

//performRequest设置我们将用于通信的HTTPS客户端,并处理对外部服务器的实际请求
//终点。它由首先设置响应数据的身份验证和收集适配器使用。
func performRequest(rawData[]字节,soapHeader字符串)(*http.Response,error){
conf:=config.GetConfig()
//设置证书处理程序和HTTP客户端。
certPool:=x509.NewCertPool()
certPool.AppendCertsFromPEM(证书)
客户端:=&http.client{
传输:&http.Transport{
TLSClientConfig:&tls.Config{
RootCAs:certPool,
不安全感skipverify:false,
},
},
}
req,err:=http.NewRequest(http.MethodPost,baseURL,bytes.NewBuffer(原始数据))
如果错误!=零{
返回零,错误
}
//为请求设置SOAPAction和内容类型标题。
请求头集合(“SOAPAction”,soapHeader)
请求标题集(“内容类型”,“文本/xml;字符集=UTF-8”)
//作为我们的定制客户端发送请求,返回响应
返回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
(正如错误所述,根本没有名字),但我看不出我是怎么做的


我应该如何排除故障?

您需要做两件事:

  • 还要在服务器端添加CA证书,CA需要被所有各方知道
  • 在服务器上生成并使用服务器证书(证书中包含主机名)。服务器证书需要由CA签名
  • 您可以在(第一个谷歌示例)上找到这方面的示例

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

    有效手段(除其他外):

  • 它由一个已知的CA签名
  • 它在
    CommonName
    主题备选名称:dns/ip
    字段中包含服务器的ip/dns(您传递给
    http.NewRequest
  • 最终编辑

    服务器证书包含设置为服务器主机名的正确的
    通用名称
    ,但它还包含设置为电子邮件地址的
    主题备选名称


    如中所述,如果找到SAN,Go now将忽略
    通用名称。

    您需要做两件事:

  • 还要在服务器端添加CA证书,CA需要被所有各方知道
  • 在服务器上生成并使用服务器证书(证书中包含主机名)。服务器证书需要由CA签名
  • 您可以在(第一个谷歌示例)上找到这方面的示例

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

    有效手段(除其他外):

  • 它由一个已知的CA签名
  • 它在
    CommonName
    主题备选名称:dns/ip
    字段中包含服务器的ip/dns(您传递给
    http.NewRequest
  • 最终编辑

    服务器证书包含设置为服务器主机名的正确的
    通用名称
    ,但它还包含设置为电子邮件地址的
    主题备选名称


    如中所述,如果找到SAN,Go现在将忽略
    通用名称。

    该证书已在我正在移植的另一个系统中生产。另外,运行
    wgethttps://secure.site --ca证书=/证书
    起作用。我的实现中一定有问题。能否使用以下命令转储服务器证书的内容:
    $openssl s_client-showcerts-connect secure。站点:443
    ,我们正在查找服务器证书:主题部分。
    服务器证书主题=/C=SE/O=Company Inc./OU=Server1024/serialNumber=165563372191/CN=secure.site issuer=/C=SE/O=Issues Inc./CN=issuer Inc.EID CA v2
    这很奇怪。我很确定证书有效性检查在主机检查之前进行,所以您的CA应该可以。为了确保这一点,您可以将
    --验证\u hostname secure.site
    添加到openssl命令中吗?根据RFC 2818,它应该以验证返回代码:0(确定)
    “…如果发现SAN,则Go现在将忽略公共名称…”结束。这是一个纯粹的错误。该证书已在我正在移植的另一个系统中生产。另外,运行
    wgethttps://secure.site --ca证书=/证书
    起作用。我的实现中一定有问题。能否使用以下命令转储服务器证书的内容:
    $openssl s_client-showcerts-connect secure。站点:443
    ,我们正在查找服务器证书:主题部分。
    服务器证书主题=/C=SE/O=Company Inc./OU=Server1024/serialNumber=165563372191/CN=secure.site issuer=/C=SE/O=Issues Inc./CN=issuer Inc.EID CA v2
    这很奇怪。我很确定证书有效性检查在主机检查之前进行,所以您的CA应该可以。为了确保这一点,您可以将
    --验证\u hostname secure.site
    添加到openssl命令中吗?根据RFC 2818,它应该以验证返回代码:0(确定)
    “如果发现了SAN,则Go现在将忽略公共名称…”结束,这是一个纯粹而简单的错误。