Ssl Golang证书验证
我使用Go来执行带有自定义根CA的HTTPS请求。根CA是我这边唯一的证书 我的代码如下所示: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
//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
(正如错误所述,根本没有名字),但我看不出我是怎么做的
我应该如何排除故障?您需要做两件事:
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现在将忽略公共名称…”结束,这是一个纯粹而简单的错误。