【问题标题】:JAVA: How to save a private key in a pem file with password protectionJAVA:如何将私钥保存在具有密码保护的 pem 文件中
【发布时间】:2014-07-01 08:59:17
【问题描述】:

我正在尝试将私钥保存在 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-----

假设在访问私钥之前询问密码! 有人可以帮我吗?

【问题讨论】:

    标签: java rsa bouncycastle


    【解决方案1】:

    您应该仔细阅读 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();
    

    当然可以用任何其他Writer 替换PrintWriter

    【讨论】:

    • 非常感谢!我不知道...而且我也不知道我使用的是过时的 BC 版本。再次感谢您。
    • 更新答案,反正我有足够的代表:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    相关资源
    最近更新 更多