【问题标题】:Trusting a specific client with golang mutual TLS auth使用 golang 双向 TLS 身份验证信任特定客户端
【发布时间】:2018-07-02 17:41:52
【问题描述】:

我已经在 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”才能成功连接。有这样的机制吗?

【问题讨论】:

    标签: ssl go


    【解决方案1】:

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

    这采用具有以下签名的方法:

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

    根据文档:

    它接收对等方提供的原始 ASN.1 证书,并且还 正常处理发现的任何经过验证的链。

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

    【讨论】:

    • 是的!这正是我一直在寻找的。我已经实现了它并且它工作得很好。太感谢了! :)
    • 很高兴听到这个消息。不过要小心:我编辑了几次答案,最初提到查看rawCerts。错了,你一定要看verifiedChains。
    • 正确,感谢您的编辑。我正在遍历verifiedChains,以将证书与我正在寻找的特定证书进行比较。
    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 2016-07-09
    • 1970-01-01
    • 2018-11-12
    • 2014-01-29
    • 2019-01-07
    • 2016-01-21
    相关资源
    最近更新 更多