3 回答
TA贡献1868条经验 获得超4个赞
我不确定如何处理错误消息
无法验证 127.0.0.1 的证书,因为它不包含任何 IP SAN
因为我在创建证书时传入了 IPAddresses 字段。关于这里有什么问题的任何想法?
问题是您在创建客户端IPAddresses证书时传递了该字段,而不是在创建服务器证书时传递,因为您的服务器只是将 CA 证书用作自己的证书,而 CA 证书(正确) 不包括 IP 地址,因此错误消息是正确的:
caKey, caKeyPEM := generateKey(t)
caCert, caCertPEM := generateRootCert(t, caKey)
serverCert, err := tls.X509KeyPair(caCertPEM, caKeyPEM)
您应该以与创建客户端证书相同的方式创建由 CA(或 CA)签名的服务器证书,并将其用于测试服务器。
通常,以您正在做的方式让单个密钥作为 CA 和作为 TLS 服务器执行双重职责是自找麻烦,在这里没有充分的理由这样做;虽然 RFC5280 实际上并没有禁止这种做法,但它至少似乎不鼓励这种做法,除非有特殊情况需要。
但是,就目前而言,您使用 CA 证书的方式在技术上不符合 RFC5280,因为它包含一个扩展的密钥使用扩展,仅指定 TLS 客户端和服务器身份验证,但您使用它来签署证书。它可能是宽容的,但在没有anyExtendedKeyUsage关键目的的情况下x509.CreateCertificate,这里真的应该失败。
TA贡献1808条经验 获得超4个赞
仔细观察ncw's gist,我注意到一个关键的区别是InsecureSkipVerify客户端的 TLS 配置中的选项设置为true. 我添加了这个,所以
client.Transport.(*http.Transport).TLSClientConfig = &tls.Config{
Certificates: []tls.Certificate{deviceCert},
RootCAs: pool,
InsecureSkipVerify: true,
}
现在测试通过了。
服务器证书的验证超出了这个测试的范围,所以这对我的目的来说已经足够了,但我仍然很想知道验证失败的原因。
- 3 回答
- 0 关注
- 203 浏览
添加回答
举报