【问题标题】:golang, can i create X509KeyPair using rsa key?golang,我可以使用 rsa 密钥创建 X509KeyPair 吗?
【发布时间】:2017-05-06 16:42:58
【问题描述】:

我正在尝试按照此博客Secure gRPC with TLS/SSL 上的说明创建具有相互 tls 的 gRPC 连接,但我不想创建证书并将其保存到磁盘上的文件中,我希望服务本身创建它的密钥,然后证书颁发机构密钥将被带到其他地方(我计划使用 google pki 作为 ca)。

到目前为止,我可以使用 rsa 创建私钥/公钥对,然后按照此处的一些代码将公钥编码为 pem 密钥 Golang : Generate DSA private, public key and PEM files example 现在我知道如何使用 LoadX509KeyPair 创建证书.我不知道从哪里获取第二个参数的值,它需要以字节为单位的 keyPemBlock,但 RSA 私钥不在字节上。

我想问一下,如果可能的话,有没有更好的方法来使用 RSA 创建证书?

如果我们可以使用 RSA 创建证书;使用我上面的不完整解决方案,我可以在哪里得到tls.LoadX509KeyPair的第二个参数的值?

谢谢

【问题讨论】:

    标签: go rsa x509certificate pem grpc


    【解决方案1】:

    如果你想生成自己的证书和私钥,你必须这样做:

    1.- 生成私钥:

    key, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        log.Fatal("Private key cannot be created.", err.Error())
    }
    
    // Generate a pem block with the private key
    keyPem := pem.EncodeToMemory(&pem.Block{
        Type:  "RSA PRIVATE KEY",
        Bytes: x509.MarshalPKCS1PrivateKey(key),
    })
    

    2.- 生成证书:

    tml := x509.Certificate{
        // you can add any attr that you need
        NotBefore:    time.Now(),
        NotAfter:     time.Now().AddDate(5, 0, 0),
        // you have to generate a different serial number each execution
        SerialNumber: big.NewInt(123123),
        Subject: pkix.Name{
            CommonName:   "New Name",
            Organization: []string{"New Org."},
        },
        BasicConstraintsValid: true,
    }
    cert, err := x509.CreateCertificate(rand.Reader, &tml, &tml, &key.PublicKey, key)
    if err != nil {
        log.Fatal("Certificate cannot be created.", err.Error())
    }
    
    // Generate a pem block with the certificate
    certPem := pem.EncodeToMemory(&pem.Block{
        Type:  "CERTIFICATE",
        Bytes: cert,
    })
    

    3.- 加载证书/私钥对:

    tlsCert, err := tls.X509KeyPair(certPem, keyPem)
    if err != nil {
        log.Fatal("Cannot be loaded the certificate.", err.Error())
    }
    

    4.- 随意使用tlsCert,例如:

    l, err := tls.Listen("tcp", ":8080", &tls.Config{
        Certificates: []tls.Certificate{tlsCert},
    })
    

    【讨论】:

    • 非常感谢,我迟到了几分钟才发布可能自己的解决方案。我的解决方案和你很相似。作为参考,我只是挖掘了这个golang.org/src/crypto/tls/generate_cert.go,这也是一个很好的例子,我的解决方案基于那个链接。
    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2020-12-26
    • 2020-09-29
    • 2018-06-07
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多