PEM 转 PKCS12
import (
// 需要使用第三方包
gopkcs12 "software.sslmate.com/src/go-pkcs12"
)
// PemCertToP12 将 pem 证书转换为 PKCS12 格式
// 传入参数为 pem 证书的内容与私钥内容
func PemCertToP12(certBuf, keyBuf []byte) (p12Cert []byte, err error) {
caBlock, certInput := pem.Decode(certBuf)
if caBlock == nil {
err = fmt.Errorf("pem 公钥证书格式错误(%v)", string(certInput))
return
}
crt, err := x509.ParseCertificate(caBlock.Bytes)
if err != nil {
err = fmt.Errorf("pem 公钥证书解析错误(%v)", err)
return
}
keyBlock, keyInput := pem.Decode(keyBuf)
if keyBlock == nil {
err = fmt.Errorf("pem 私钥证书格式错误(%v)", string(keyInput))
return
}
priKey, err := x509.ParsePKCS1PrivateKey(keyBlock.Bytes)
if err != nil {
err = fmt.Errorf("pem 私钥证书解析错误(%v)", err)
return
}
pfx, err := gopkcs12.Encode(rand.Reader, priKey, crt, nil, "")
if err != nil {
err = fmt.Errorf("证书转换错误(%v)", err)
return
}
return pfx, err
}
PKCS12 转 PEM
import (
// 需要使用第三方包
gopkcs12 "software.sslmate.com/src/go-pkcs12"
)
// ConvertP12Detail 解析 P12 证书内容,获取过期时间与域名
// 传入参数为 P12 证书内容与密码
func ConvertP12Detail(cert []byte, password string) (commonName string, expirationTime time.Time, err error) {
_, crt, err := gopkcs12.Decode(cert, password)
if err != nil {
err = fmt.Errorf("解析 P12 证书内容错误(%v)", err)
return
}
return crt.Subject.CommonName, crt.NotAfter, nil
}
扩展
openstack 组件 Barbican 处理证书需要将证书内容 Base64 处理之后上传,且证书格式必须为 PKCS12
文档信息
- 本文作者:Lewin
- 本文链接:https://lewinz.com/2021/08/04/golang-cert-convert/
- 版权声明:自由转载-非商用-非衍生-保持署名