大家好我正在尝试将我在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库,所以也许它有一个我忽略的解决方案。
答案 0 :(得分:9)
您可以使用Bouncycastle中的PEMWriter课程。
答案 1 :(得分:5)
OpenSSL使用它自己的格式这一事实确实是唯一能让这种挑战变得困难的事情。值得庆幸的是,充气城堡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();
答案 2 :(得分:2)
使用标题:
-----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结构并对其进行编码。请澄清这是否是您所需要的。