将私钥转换为 PEM 格式

Lol*_*lly 9 java ssl openssl ssl-certificate x509certificate

我已经用 Java 代码创建了一个自签名证书并添加到 KeyStore 中。现在我想将创建的私钥和证书导出到 PEM 格式的文件中。是否有可能在没有任何第三方库的情况下实现这一目标?下面是我用于创建自签名证书的代码。

  public void createSelfSignedSSLCertificate() {
    try {            
        final CertAndKeyGen keypair = new CertAndKeyGen("RSA", "SHA1WithRSA", null);
        final X500Name x500Name =
            new X500Name(commonName, organizationalUnit, organization, city, state, country);
        keypair.generate(keysize);
        final PrivateKey privKey = keypair.getPrivateKey();
        final X509Certificate[] chain = new X509Certificate[1];
        chain[0] = keypair.getSelfCertificate(x500Name, new Date(), validity * 24 * 60 * 60);
        final String alias = JettySSLConfiguration.SSL_CERTIFICATE_ALIAS;
        keyStore.setKeyEntry(alias, privKey, keyStorePassword.toCharArray(), chain);
    } catch (final Exception e) {
       // Handle Exception
    }       
}
Run Code Online (Sandbox Code Playgroud)

关于如何将密钥和证书导出为 PEM 格式的文件的任何建议都将非常有帮助。

Dan*_*ger 8

您使用Certificate.getEncoded()Key.getEncoded()来获取 DER 并手动执行 base 64 编码和页眉/页脚,例如使用DatatypeConverter.printBase64Binary()或其他方式。就像是:

certpem = "-----BEGIN CERTIFICATE-----\n" +
          DatatypeConverter.printBase64Binary(chain[0].getEncoded())) +
          "\n-----END CERTIFICATE-----\n";
keypem  = "-----BEGIN RSA PRIVATE KEY-----\n" +
          DatatypeConverter.printBase64Binary(privKey.getEncoded())) +
          "\n-----END RSA PRIVATE KEY-----\n";
Run Code Online (Sandbox Code Playgroud)

  • 正如记录的那样,`[Private]Key.getEncoded()` 返回的编码始终是 PKCS8,并且 PKCS8 的正确 PEM 类型是并且曾经是 `PRIVATE KEY`(如 Anup 最新的 A 中所示)_不是_ `RSA PRIVATE关键`。这在 RFC7468 中得到了正式化,尽管那是在 A 发布 2 年后。 (3认同)

小智 5

感谢 Daniel Roethlisberger 的回复。我从你的回复中得到了很大的帮助..

在Java中实现如下

String encodedString = "-----BEGIN PRIVATE KEY-----\n";
            encodedString = encodedString+Base64.getEncoder().encodeToString(Enrollment2.getKey().getEncoded())+"\n";
            encodedString = encodedString+"-----END PRIVATE KEY-----\n";
Run Code Online (Sandbox Code Playgroud)