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 库,所以也许它有一个我忽略的解决方案。

4

3 回答 3

10

您可以在 Bouncycastle 中使用PEMWriter类。

于 2010-08-25T00:00:26.027 回答
7

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();
于 2012-09-16T04:16:14.077 回答
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 结构并对其进行编码。请澄清这是否是您需要的。

于 2010-08-24T23:37:34.817 回答