golang pem证书转p12
要用到的一个第三方包
software.sslmate.com/src/go-pkcs12
下面直接上代码
// pem证书转成mac需要的p12证书
// 传入的内容是pem证书内容和私钥内容
func certToP12(certBuf,keyBuf []byte) (p12Cert,certPwd string,err error) {
caBlock, _ := pem.Decode(certBuf)
crt, err := x509.ParseCertificate(caBlock.Bytes)
if err != nil {
err = fmt.Errorf("证书解析异常, Error : %v",err)
LOG_ERROR_F("%v",err)
return
}
keyBlock, _ := pem.Decode(keyBuf)
priKey, err := x509.ParsePKCS1PrivateKey(keyBlock.Bytes)
if err != nil {
err = fmt.Errorf("证书密钥解析key异常, Error : %v",err)
LOG_ERROR_F("%v",err)
return
}
certPwd = "p12pwdword"
pfx, err := gopkcs12.Encode(rand.Reader, priKey, crt, nil, certPwd)
if err != nil {
err = fmt.Errorf("pem to p12 转换证书异常, Error : %v",err)
LOG_ERROR_F("%v",err)
return
}
return base64.StdEncoding.EncodeToString(pfx),certPwd,err
}
下面再加一个p12证书解析的,主要是获取证书序列号和过期时间,其它的自行探索
// 解析MDM证书
// 传入的内容是证书文件内容和mdm的证书密码
func getMDMCertCont(cert []byte, mdmPwd string) (certbase64 string, certsn string, after time.Time, err error) {
// extract key and cert
_, crt, err := pkcs12.Decode(cert, mdmPwd)
if err != nil {
fmt.Printf("Error : %v", err)
return
}
fmt.Printf("%v\n", cert)
serialHex := fmt.Sprintf("%x", crt.SerialNumber)
if len(serialHex)%2 == 1 {
serialHex = fmt.Sprintf("0%s", serialHex)
}
return base64.StdEncoding.EncodeToString(cert), serialHex, crt.NotAfter, nil
}