繁体   English   中英

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

[英]Convert a PKCS#8 private key to PEM in java

大家好我正在尝试将我在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库,所以也许它有一个我忽略的解决方案。

您可以在Bouncycastle中使用PEMWriter类。

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

使用标题:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM