代码之家  ›  专栏  ›  技术社区  ›  Hiro2k

在Java中将PKCS 8私钥转换为PEM

  •  7
  • Hiro2k  · 技术社区  · 16 年前

    大家好,我正在尝试把我在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
    

    为了正确地将这个私钥转换成我需要的PEM格式,我缺少什么步骤?我不能在程序中使用openssl,否则我只需添加该函数调用。我可以在这个程序中访问bouncycastle libs,所以也许它有一个我忽略的解决方案。

    3 回复  |  直到 13 年前
        1
  •  9
  •   President James K. Polk    16 年前

    你可以使用 PEMWriter 在BouncyCastle中初始化。

        2
  •  5
  •   gflarity    13 年前

    事实上,openssl使用它自己的格式,这是唯一一个使这一点具有挑战性的东西。值得庆幸的是,BouncyCastlePemWriter使这个过程变得简单,但是界面没有很好的文档记录。我通过搜索邮件列表找到了一些代码。我已将其改编如下:

    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();
    
        3
  •  2
  •   erickson    16 年前

    使用页眉:

    -----BEGIN PRIVATE KEY-----
    

    …和页脚:

    -----END PRIVATE KEY-----
    

    注意,“RSA”被排除在外,Java代码使用私有密钥的PKCSα8编码,并且编码包括算法。

    这个 openssl 您显示的命令是将der形式的标准pkcs_8密钥转换为pem形式的专有openssl密钥。要保留pkcs 8格式,但从der转换为pem,请添加-topk8选项。然后OpenSSL输出应该与Java代码所生成的内容相匹配。

    推荐文章