登录
首页 >  Golang >  Go问答

如何将rawCerts字节转换为x509.Certificate使用golang和tls?

来源:stackoverflow

时间:2024-03-21 18:00:44 331浏览 收藏

本文介绍如何将 `rawCerts` 字节转换为 `x509.Certificate`,以便在 Go 和 TLS 中使用。当需要建立到具有不同域证书的服务器的 TLS 连接时,此转换是必要的。`verifypeercertificate` 函数要求 `x509.Certificate` 类型的证书,而 `rawCerts` 字节数组不能直接使用。`x509.ParseCertificate` 函数可用于将 `rawCerts` 转换为 `x509.Certificate`。

问题内容

上下文:我想建立到服务器的 tls 连接,该服务器具有具有不同(但已知!)域的证书。

所以我想使用 tls.dial('tcp', 'real-domain', conf),但验证证书的域,就好像它是另一个域一样(让我们称之为 wrong-domain),我知道服务器应该返回它。

因此,我认为执行此操作的方法是在客户端 tls.config 中覆盖 verifypeercertificate

verifypeercertificate 获取 rawcerts [][]byte 作为参数,但要使用 x509.verify 我需要 x509.certificate 类型的证书。

问题是:如何对 rawcerts [][]byte 进行中心转换,它作为参数传递给 verifypeercertificate 并转换为 x509.certificate

这就是我想要的使用方式:

conf := &tls.Config{
        VerifyPeerCertificate: func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {
            verifyOptions := x509.VerifyOptions{
                DNSName:                   "wrong-domain",
                Roots:                     serverCertPool,
            }
            cert := &x509.Certificate{???} // How do I get the x509.Certificate out of the rawCerts [][]byte parameter?
            _, err := cert.Verify(verifyOptions)
            return err
        },
        InsecureSkipVerify: true, // We verify in VerifyPeerCertificate
    }

正确答案


使用x509.ParseCertificate

parsecertificate 从给定的 asn.1 der 数据中解析单个证书。

示例:cert, err := x509.parsecertificate(rawcerts[0])

顺便说一下,调用 verifypeercertificate 的函数也是这样做的:

// crypto/tls/handshake/handshake_client.go

func (c *Conn) verifyServerCertificate(certificates [][]byte) error {
    for i, asn1Data := range certificates {
        cert, err := x509.ParseCertificate(asn1Data)
        if err != nil {
            c.sendAlert(alertBadCertificate)
            return errors.New("tls: failed to parse certificate from server: " + err.Error())
        }
        certs[i] = cert
    }

    // later on...
    
    if c.config.VerifyPeerCertificate != nil {
        if err := c.config.VerifyPeerCertificate(certificates, c.verifiedChains); err != nil {
            c.sendAlert(alertBadCertificate)
            return err
        }
    }

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>