为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中将 x509.Certificate 转换为 tls.Certificate?

如何在 Go 中将 x509.Certificate 转换为 tls.Certificate?

Go
MMTTMM 2021-11-29 15:41:37
我正在使用x/crypto/pkcs12加载 DER 格式的 *.p12 文件。文档中有一个示例,用于tls.X509KeyPair制作tls.Certificate可用于 HTTP 客户端的 。这很完美,而且效果很好。但后来我也想验证证书没有过期。该pkcs12库还有一个Decode 函数,它返回一个 x509 证书,我可以使用验证方法。这也很好用。我对 DER 解码两次对我来说似乎很奇怪。一次用于x509.Certificate验证,再次获得tls.Certificate. 我不知道这两个证书结构之间的关系,但看到 tls 包有一个名为 tls.X509KeyPair 的函数,它需要一些字节,不应该有一种明显的方法从 x509 获取 tls.Certificate 。证书还是签证?我错过了什么?
查看完整描述

2 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

tls.Certificate 通常存储证书- 换句话说,> 1 个证书。请注意,它的Certificate字段是类型[][]byte,其中每个证书都是一个[]byte.

tls 包导入了 x509 包,因此 x509 中没有获取 tls.Certificate 的函数;这将导致进口周期。但是如果你有一个 x509.Certificate,你就已经有一个 tls.Certificate;只需将 x509.Certificate 的Raw字节放入 tls.Certificate 的Certificate切片中。


查看完整回答
反对 回复 2021-11-29
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

你可以这样做:


func LoadP12TLSCfg(keystore, password string) (*x509.CertPool, tls.Certificate, error) {

    data, err := ioutil.ReadFile(keystore)

    if err != nil {

        return nil, tls.Certificate{}, err


    }

    pk, crt, caCrts, err := pkcs12.DecodeChain(data, password)

    if err != nil {

        return nil, tls.Certificate{}, err

    }

    pool := x509.NewCertPool()

    pool.AddCert(caCrts[0])

    tlsCrt := tls.Certificate{

        Certificate: [][]byte{crt.Raw},

        Leaf:        crt,

        PrivateKey:  pk,

    }

    return pool, tlsCrt, nil

}


func LoadServerTLSCfg(keystore, password string) (*tls.Config, error) {

    pool, crt, err := LoadP12TLSCfg(keystore, password)

    if err != nil {

        return nil, err

    }

    cfg := &tls.Config{

        ClientCAs:    pool,

        ClientAuth:   tls.RequireAndVerifyClientCert,

        Certificates: []tls.Certificate{crt},

    }

    return cfg, nil

}


func LoadClientTLSCfg(keystore, password string, serverName string) (*tls.Config, error) {

    pool, crt, err := LoadP12TLSCfg(keystore, password)

    if err != nil {

        return nil, err

    }

    cfg := &tls.Config{

        RootCAs:      pool,

        Certificates: []tls.Certificate{crt},

        ServerName:   serverName,

    }

    return cfg, nil

}


查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 255 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信