JAVA:如何使用密码保护将私钥保存在pem文件中

时间:2014-07-01 08:59:17

标签: java rsa bouncycastle

我正在尝试将私钥保存在pem文件中,并使用密码进行保护。问题是,pem文件已创建,我 甚至可以用openssl打开它,但不要求密码!

以下是代码:

KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
keygen.initialize(2048);
KeyPair keypair = keygen.generateKeyPair();

PrivateKey privKey = keypair.getPrivate();

PKCS8Generator encryptorBuilder = new PKCS8Generator(privKey);
encryptorBuilder.setPassword("testing".toCharArray());
PEMWriter writer = new PEMWriter(new FileWriter(new File("pk.pem")));
PemObject obj = encryptorBuilder.generate();

writer.writeObject(obj);
writer.flush();
writer.close();

执行后,我尝试打开pk.pem文件

openssl rsa -in pk.pem -check

它给出了:

RSA key ok
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
(... some key appears here ...)
-----END RSA PRIVATE KEY-----

假设在访问私钥之前要求输入密码! 有人可以帮助我吗?

1 个答案:

答案 0 :(得分:6)

那么你应该仔细阅读BouncyCastle文档。它声明了您使用的构造函数:

// Constructor for an unencrypted private key PEM object.
PKCS8Generator(java.security.PrivateKey key)

// Constructor for an encrypted private key PEM object.
PKCS8Generator(java.security.PrivateKey key, java.lang.String algorithm, java.lang.String provider)

因此,您正在使用构造函数来创建未加密的PKCS8Generator实例。您设置的密码无效。

使用其他构造函数之一,根据文档创建加密实例。

注意:问题中的代码需要一个过时的BouncyCastle版本(1.4x?),因为当前版本(1.5x)具有不同的构造函数,与本答案中提供的版本不兼容。


对于较新版本,请使用:

import org.bouncycastle.openssl.jcajce.JcaPEMWriter;

JcaPEMWriter writer = new JcaPEMWriter(new PrintWriter(System.out));
writer.writeObject(sk);
writer.close();

当然可能会将PrintWriter替换为任何其他Writer