猿问

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

我正在使用x/crypto/pkcs12加载 DER 格式的 *.p12 文件。文档中有一个示例,用于tls.X509KeyPair制作tls.Certificate可用于 HTTP 客户端的 。

这很完美,而且效果很好。但后来我也想验证证书没有过期。该pkcs12库还有一个Decode 函数,它返回一个 x509 证书,我可以使用验证方法。这也很好用。

我对 DER 解码两次对我来说似乎很奇怪。一次用于x509.Certificate验证,再次获得tls.Certificate. 我不知道这两个证书结构之间的关系,但看到 tls 包有一个名为 tls.X509KeyPair 的函数,它需要一些字节,不应该有一种明显的方法从 x509 获取 tls.Certificate 。证书还是签证?我错过了什么?


MMTTMM
浏览 256回答 2
2回答

慕容3067478

tls.Certificate 通常存储证书链- 换句话说,> 1 个证书。请注意,它的Certificate字段是类型[][]byte,其中每个证书都是一个[]byte.tls 包导入了 x509 包,因此 x509 中没有获取 tls.Certificate 的函数;这将导致进口周期。但是如果你有一个 x509.Certificate,你就已经有一个 tls.Certificate;只需将 x509.Certificate 的Raw字节放入 tls.Certificate 的Certificate切片中。

芜湖不芜

你可以这样做: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}
随时随地看视频慕课网APP

相关分类

Go
我要回答