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

使用 golang 如何生成 rsa 证书,然后将私钥导出到 pfx 文件

使用 golang 如何生成 rsa 证书,然后将私钥导出到 pfx 文件

Go
犯罪嫌疑人X 2022-05-23 17:33:20
我想通过 golang 生成一些证书,但遇到了一个问题。当我在 php 中这样做时,它可能像那些代码:$privkey = openssl_pkey_new([    'digest_alg' => 'des3',    'private_key_bits' => 1024,    'private_key_type' => OPENSSL_KEYTYPE_RSA]);$csr = openssl_csr_new([    "countryName" => "EN",    "stateOrProvinceName" => "province",    "localityName" => "city",    "organizationName" => "org",    "organizationalUnitName" => "org",    "commonName" => "name",], $privkey, ['digest_alg' => 'des3']);$x509 = openssl_csr_sign($csr, null, $privkey, $days=3650, ['digest_alg' => 'des3']);openssl_x509_export_to_file($x509, "/path/to/pub.cer");openssl_pkcs12_export_to_file($x509, "/path/to/pri.pfx", $privkey, "password");现在使用 golang 我只能创建私钥,但不知道下一步该做什么。请帮助我,非常感谢。func main() {    keyBytes, err := rsa.GenerateKey(rand.Reader, bitSize)    if err != nil {        panic(err)    }    if err := keyBytes.Validate(); err != nil {        panic(err)    }    dn := pkix.Name{        Country:            []string{"EN"},        Organization:       []string{"org"},        OrganizationalUnit: []string{"org"},        Locality:           []string{"city"},        Province:           []string{"province"},        CommonName:         "name",    }    asn1Dn, err := asn1.Marshal(dn)    if err != nil {        panic(err)    }    template := x509.CertificateRequest{        Raw:                asn1Dn,        SignatureAlgorithm: x509.SHA256WithRSA,    }    csrBytes, err := x509.CreateCertificateRequest(rand.Reader, &template, keyBytes)    // how to do with csrBytes next?}
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

最后我自己解决了这个问题。现在我应该为其他面临同样问题的人写下答案。


解决方案是使用software.sslmate.com/src/go-pkcs12which 提供函数Encode来编码从x509.CreateCertificate.


看下面的示例代码:


func main() {

    keyBytes, err := rsa.GenerateKey(rand.Reader, 1024)


    if err != nil {

        panic(err)

    }


    if err := keyBytes.Validate(); err != nil {

        panic(err)

    }


    template := &x509.Certificate{

        SerialNumber: big.NewInt(1),

        Subject: pkix.Name{

            Country:            []string{"EN"},

            Organization:       []string{"org"},

            OrganizationalUnit: []string{"org"},

            Locality:           []string{"city"},

            Province:           []string{"province"},

            CommonName:         "name",

        },

    }


    derBytes, err := x509.CreateCertificate(rand.Reader, template, template, &keyBytes.PublicKey, keyBytes)


    if err != nil {

        panic(err)

    }


    cert, err := x509.ParseCertificate(derBytes)


    if err != nil {

        panic(err)

    }


    pfxBytes, err := pkcs12.Encode(rand.Reader, keyBytes, cert, []*x509.Certificate{}, pkcs12.DefaultPassword)


    if err != nil {

        panic(err)

    }


    // see if pfxBytes valid

    _, _, _, err = pkcs12.DecodeChain(pfxBytes, pkcs12.DefaultPassword)

    if err != nil {

        panic(err)

    }

    if err := ioutil.WriteFile(

        "/path/to/pri.pfx",

        pfxBytes,

        os.ModePerm,

    ); err != nil {

        panic(err)

    }

}

大家可以在我的github repo yuchanns/gobyexample中找到源代码


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 340 浏览
慕课专栏
更多

添加回答

举报

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