在Java中将PKCS#8私钥转换为PEM

7

大家好,我正在尝试将我在Java程序中生成的PKCS#8私钥转换为PEM编码文件。

Security.addProvider(new BouncyCastleProvider());
SecureRandom rand = new SecureRandom();
JDKKeyPairGenerator.RSA keyPairGen = new JDKKeyPairGenerator.RSA();        
keyPairGen.initialize(2048, rand);
KeyPair keyPair = keyPairGen.generateKeyPair();

PEMWriter privatepemWriter = new PEMWriter(new FileWriter(new File(dir + "private.key")));
privatepemWriter.writeObject(keyPair.getPrivate());

运行程序后,我得到了私钥的两种格式以及公钥(代码未显示因为它可以工作)。然后我使用这个openssl命令将private.key转换回pem格式的文件。

openssl pkcs8 -nocrypt -inform DER -in private.key -out private2.pem

当我比较private.pem和private2.pem时,它们是不同的,显然当我尝试使用private.pem时,它会说这不是一个有效的文件。

我错过了哪个步骤才能正确地将此私钥转换为我需要的PEM格式?我无法在程序内部使用OpenSSL,否则我只需添加该函数调用即可。我可以在此程序中访问BouncyCastle库,因此可能有一个解决方案我正在忽略。


你试图与哪个软件进行互操作?(当你说“它说这不是一个有效的文件”时,“它”是什么?) - erickson
当我尝试使用private.key进行各种操作时,Curl和OpenSSL会发出相同的警告。 - Hiro2k
1
缺少 privatepemWriter.close(); // 以正确刷新。谢谢。 - Laurent Debricon
3个回答

11

您可以在Bouncycastle中使用PEMWriter类。


谢谢,这很好用,我能够删除所有冗余代码!阅读源代码帮助我弄清楚要传递哪些对象。http://www.java2s.com/Open-Source/Java-Document/Security/Bouncy-Castle/org/bouncycastle/openssl/PEMWriter.java.htm - Hiro2k

8

OpenSSL使用自己的格式是唯一让此过程变得具有挑战性的地方。幸运的是,Bouncy Castle PEMWriter可以轻松解决这个问题,但其接口并没有很好地记录下来。通过搜索邮件列表,我找到了一些代码。我已经进行了适当调整,如下所示:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair(); 
StringWriter stringWriter = new StringWriter();
PEMWriter pemWriter = new PEMWriter(stringWriter);  
pemWriter.writeObject( keyPair.getPrivate());
pemWriter.close();
privateKeyString = stringWriter.toString();

3

使用页头:

-----BEGIN PRIVATE KEY-----

...还有页脚:

-----END PRIVATE KEY-----

注意,“RSA”被省略了——Java代码使用PKCS #8编码私钥,该编码包括算法信息。
您展示的openssl命令是将DER格式的标准PKCS #8密钥转换为专有的PEM格式的OpenSSL密钥。要保留PKCS #8格式但将其从DER转换为PEM,请添加-topk8选项。然后,OpenSSL输出应与您的Java代码产生的相匹配。
如果需要生成OpenSSL密钥而不是PKCS #8,则可以使用BouncyCastle ASN.1库创建自己的OpenSSL结构并对其进行编码。请澄清您需要的内容。

是的,我想要生成 OpenSSL 密钥而不是 PKCS#8。我查看了下面的 PEMWriter,但考虑到转换,我不知道它是否能满足我的需求。 - Hiro2k
1
你试一下又不会有什么损失,何不试试看呢? - President James K. Polk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接