gpt4 book ai didi

ssl - 使用 golang mutual TLS auth 信任特定客户端

转载 作者:IT王子 更新时间:2023-10-29 01:35:00 26 4
gpt4 key购买 nike

我已经在 Go 中成功设置了 TLS 相互身份验证客户端/服务器一段时间,但现在希望进行一些小的调整。

具体来说,我想知道是否有一种方法只需要特定的客户端证书即可进行相互身份验证。

我目前正在使用这样的东西:

    // Load cert and build pool
caCert, _ := ioutil.ReadFile(caPath)
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)

// Require client authentication
tlsConfig := &tls.Config{
ClientAuth: tls.RequireAndVerifyClientCert,
ClientCAs: caCertPool,
}

这很好用,但是如果我正在读取的 PEM 文件实际上是一个证书链(A 由 B 颁发,B 是根 CA),这实际上最终会信任 B 颁发的任何证书,我不想。

有什么方法可以调整此代码以仅信任特定的 A 证书吗?

似乎如果我只在加载的 PEM 文件中包含 A,server handshake code告诉客户“把你所有由 A 签名的证书发给我”,这当然不是我想要的,因为证书 A 不是由 A 签名的。

理想情况下,我想说“您需要专门的证书 A”才能成功连接。有没有这样的机制?

最佳答案

没有机制可以为您执行此操作,但从 go 1.8 开始您可以使用 tls.Config 中的 VerifyPeerCertificate 字段指定您自己的回调对象(这适用于服务器端和客户端)。

这需要一个具有以下签名的方法:

func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error

根据文档:

It receives the raw ASN.1 certificates provided by the peer and also any verified chains that normal processing found.

证书验证已经运行,因此您只需应用您的特定逻辑:检查 verifiedChains 中的叶证书(每个链中的第一个)并检查证书是否在允许的列表中证书(在你的情况下只是 A)。如果不是:返回错误,握手失败。

关于ssl - 使用 golang mutual TLS auth 信任特定客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48409589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com