Golang中如何将Pfx证书转换为Base64编码

Golang中如何将Pfx证书转换为Base64编码 我想在我的代码中集成第三方API。我拥有该API的详细信息。 我想传递一个包含数据的密钥。 我有一个pfx证书(从网站购买),我想将其转换为pkcs7格式的base64编码。 我在网上查找了很多帮助,但没有找到任何有用的信息。

3 回复

我们可以将PFX文件转换为PEM文件。

但是,在将PEM转换为P7B/PKCS#7时,命令还要求提供CER文件。 我们没有这些信息。

更多关于Golang中如何将Pfx证书转换为Base64编码的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


openssl 命令可以在不同证书格式之间进行转换。我在这里找到了一个页面,其中展示了转换所需的命令。看起来你需要先将 PFX 转换为 PEM,然后再将 PEM 转换为 P7B/PKCS#7。

在Golang中将PFX证书转换为Base64编码的PKCS7格式,可以使用crypto/x509encoding/pem包。以下是一个完整的示例:

package main

import (
    "crypto/x509"
    "encoding/base64"
    "encoding/pem"
    "fmt"
    "io/ioutil"
    "log"
)

func main() {
    // 读取PFX文件
    pfxData, err := ioutil.ReadFile("certificate.pfx")
    if err != nil {
        log.Fatal("读取PFX文件失败:", err)
    }

    // 解码PFX(需要密码)
    password := "your-pfx-password"
    privateKey, cert, err := decodePFX(pfxData, password)
    if err != nil {
        log.Fatal("解码PFX失败:", err)
    }

    // 创建PKCS7结构
    pkcs7Data, err := createPKCS7(cert, privateKey)
    if err != nil {
        log.Fatal("创建PKCS7失败:", err)
    }

    // 转换为Base64编码
    base64Str := base64.StdEncoding.EncodeToString(pkcs7Data)
    fmt.Println("Base64编码的PKCS7证书:")
    fmt.Println(base64Str)
}

func decodePFX(pfxData []byte, password string) (interface{}, *x509.Certificate, error) {
    // 解码PFX
    privateKey, cert, err := x509.DecryptPfxData(pfxData, password)
    if err != nil {
        return nil, nil, err
    }
    return privateKey, cert, nil
}

func createPKCS7(cert *x509.Certificate, privateKey interface{}) ([]byte, error) {
    // 将证书编码为PEM格式
    certPEM := pem.EncodeToMemory(&pem.Block{
        Type:  "CERTIFICATE",
        Bytes: cert.Raw,
    })

    // 将私钥编码为PEM格式
    keyPEM, err := encodePrivateKeyToPEM(privateKey)
    if err != nil {
        return nil, err
    }

    // 组合证书和私钥(根据实际需求调整格式)
    pkcs7Data := append(keyPEM, certPEM...)
    return pkcs7Data, nil
}

func encodePrivateKeyToPEM(privateKey interface{}) ([]byte, error) {
    // 根据私钥类型进行编码
    switch key := privateKey.(type) {
    case *rsa.PrivateKey:
        return pem.EncodeToMemory(&pem.Block{
            Type:  "RSA PRIVATE KEY",
            Bytes: x509.MarshalPKCS1PrivateKey(key),
        }), nil
    case *ecdsa.PrivateKey:
        keyBytes, err := x509.MarshalECPrivateKey(key)
        if err != nil {
            return nil, err
        }
        return pem.EncodeToMemory(&pem.Block{
            Type:  "EC PRIVATE KEY",
            Bytes: keyBytes,
        }), nil
    default:
        return nil, fmt.Errorf("不支持的私钥类型")
    }
}

如果需要完整的PKCS7签名结构,可以使用github.com/fullsailor/pkcs7包:

import "github.com/fullsailor/pkcs7"

func createSignedPKCS7(cert *x509.Certificate, privateKey interface{}) ([]byte, error) {
    // 创建PKCS7签名数据
    signedData, err := pkcs7.NewSignedData([]byte(""))
    if err != nil {
        return nil, err
    }

    // 添加签名者
    err = signedData.AddSigner(cert, privateKey, pkcs7.SignerInfoConfig{})
    if err != nil {
        return nil, err
    }

    // 完成签名
    pkcs7Bytes, err := signedData.Finish()
    if err != nil {
        return nil, err
    }

    return pkcs7Bytes, nil
}

运行前需要安装依赖:

go get github.com/fullsailor/pkcs7

注意:实际使用时需要根据第三方API的具体要求调整PKCS7的格式和内容。

回到顶部