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

在java中将PKCS#8私钥转换为PEM,java,encryption,ssl,bouncycastle,pem,Java,Encryption,Ssl,Bouncycastle,Pem,大家好,我正在尝试将我在java程序中生成的PKCS#8私钥转换为PEM编码的文件 Security.addProvider(new BouncyCastleProvider()); SecureRandom rand = new SecureRandom(); JDKKeyPairGenerator.RSA keyPairGen = new JDKKeyPairGenerator.RSA(); keyPairGen.initialize(2048, rand); KeyPair

大家好,我正在尝试将我在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库,因此可能有一个我忽略的解决方案。

使用标题:

-----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结构并对其进行编码。请澄清这是否是您所需要的。

您可以在Bouncycastle中使用该类。

OpenSSL使用自己的格式这一事实确实是唯一让这一点具有挑战性的事情。谢天谢地,BouncyCastle编写器使这变得很容易,但是界面并没有很好的文档记录。我通过搜索邮件列表找到了一些代码。我将其改编如下:

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();

是的,我想要的是生成OpenSSL密钥,而不是PKCS#8。我看了一下PEMWriter bellow,但考虑到转换,我不知道这是否能满足我的需要。尝试一下看看会不会伤害你?你想与什么软件交互?(当你说“它说它不是一个有效的文件”时,“它”是什么?)当我尝试使用private.key进行各种操作时,Curl和OpenSSL会说同样的话。缺少privatepemWriter.close();//正确冲洗。谢谢。谢谢。这很好,我能够删除所有多余的代码!阅读源代码有助于我了解要传递的对象。是的,bouncycastle文档很差,但是源代码很容易阅读!