Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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
Go 如何修复x509:无法验证<;的证书;知识产权>;因为它没有';不包含任何IP SAN_Go_Tls1.2_X509 - Fatal编程技术网

Go 如何修复x509:无法验证<;的证书;知识产权>;因为它没有';不包含任何IP SAN

Go 如何修复x509:无法验证<;的证书;知识产权>;因为它没有';不包含任何IP SAN,go,tls1.2,x509,Go,Tls1.2,X509,我正在使用go http客户端连接到具有自签名证书的iot设备。我已经有了 TLSClientConfig: &tls.Config{ RootCAs: certPool, Certificates: []tls.Certificate{tlsClientCert}, InsecureSkipVerify: true, }, 尽管如此,尽管go仍然尝试验证证书: x509: cannot

我正在使用go http客户端连接到具有自签名证书的iot设备。我已经有了

    TLSClientConfig: &tls.Config{
        RootCAs:            certPool,
        Certificates:       []tls.Certificate{tlsClientCert},
        InsecureSkipVerify: true,
    },
尽管如此,尽管go仍然尝试验证证书:

x509: cannot validate certificate for <ip> because it doesn't contain any IP SANs
这是openssl在运行
openssl s_client-connect
时所说的:

更新我正在运行最新的go 1.15.2

这可能有用

在证书中有一个名为“SANs”的字段,我们需要在这个SAN列表中添加“hostname”

添加后,应使用“ServerName”字段在TLS配置中添加相同的名称。完成此配置后,将解决此问题。在SANS属性中,我添加了“test.com”,因此我按如下方式配置了TLS

        ServerName:   "test.com",
        RootCAs:      pool,
        Certificates: []tls.Certificate{clientCert},
        MinVersion:   tls.VersionTLS12,
自证书颁发之日起;重复使用可能不包含任何SAN,发生此错误。我还在探索中,如果你们对此有任何评论,请留下回复。

这可能有用

在证书中有一个名为“SANs”的字段,我们需要在这个SAN列表中添加“hostname”

添加后,应使用“ServerName”字段在TLS配置中添加相同的名称。完成此配置后,将解决此问题。在SANS属性中,我添加了“test.com”,因此我按如下方式配置了TLS

        ServerName:   "test.com",
        RootCAs:      pool,
        Certificates: []tls.Certificate{clientCert},
        MinVersion:   tls.VersionTLS12,

自证书颁发之日起;重复使用可能不包含任何SAN,发生此错误。我仍在探索中,如果你们对此有任何意见,请留下答复。

您可以在您的请求中指定一个
主机,该主机位于证书的SAN中。我所拥有的只是来自DNS-SD的设备名称。作为应用程序的一部分,我甚至没有读到它的cert/SAN,所以我不知道该怎么做。另外:错误消息包含远程IP,因此它是本地go客户端发出的。它甚至不应该在这里验证证书?@andig:Setting
unsecureskipverify
应该足够了,我怀疑问题出在其他地方。您能否发布一个演示问题的最小但完整的工作程序,以及完整的错误消息?我已经更新了示例和openssl诊断。@andig:谢谢您提供。您使用的是哪个版本的围棋?尝试的一些建议:(1)输出
unsecure
的值,以确保它确实被设置为
true
——发生了奇怪的事情;(2) 通常,您应该设置
ServerName
unsecureskipverify
,但不能同时设置这两者,因此,如果
unsecures
true
,请尝试不要设置
ServerName
;(3) 你不应该在
tls.Config
传递给
tls
包函数后修改它,所以每次尝试在你的内部循环中移动它的定义来创建一个新的配置。你可以在你的请求中指定一个
主机,该主机位于证书的SAN中。我所拥有的只是来自DNS-SD的设备名称。作为应用程序的一部分,我甚至没有读到它的cert/SAN,所以我不知道该怎么做。另外:错误消息包含远程IP,因此它是本地go客户端发出的。它甚至不应该在这里验证证书?@andig:Setting
unsecureskipverify
应该足够了,我怀疑问题出在其他地方。您能否发布一个演示问题的最小但完整的工作程序,以及完整的错误消息?我已经更新了示例和openssl诊断。@andig:谢谢您提供。您使用的是哪个版本的围棋?尝试的一些建议:(1)输出
unsecure
的值,以确保它确实被设置为
true
——发生了奇怪的事情;(2) 通常,您应该设置
ServerName
unsecureskipverify
,但不能同时设置这两者,因此,如果
unsecures
true
,请尝试不要设置
ServerName
;(3) 您不应该在
tls.Config
传递给
tls
包函数后修改它,所以每次尝试在内部循环中移动它的定义以创建新的配置。
        ServerName:   "test.com",
        RootCAs:      pool,
        Certificates: []tls.Certificate{clientCert},
        MinVersion:   tls.VersionTLS12,