如何将x509 Cert和Key转换为pkcs12文件

时间:2017-01-03 02:20:11

标签: java bouncycastle x509

要将包含x509证书+私钥的pem文件转换为pkcs12(.p12)文件,请使用以下命令:

openssl pkcs12 -export -inkey cert_pkey.pem -in cert_pkey.pem -out cert.p12

我正在尝试使用Java和BouncyCastle库以编程方式完成相同的操作。我能够从PEMObject中提取X509Cert,但私钥一直令人困惑。

对拼凑这些步骤的任何帮助表示赞赏:

  1. 使用PEMParser打开cert_pkey.pem文件流
  2. 从PemObject获取X509证书(已完成)
  3. 从PemObject获取私钥(如何?)
  4. 使用密码
  5. 创建实例类型PKCS12的KeyStore

2 个答案:

答案 0 :(得分:1)

最后解决了如何单独获取证书和密钥 - 不确定为什么它按照计算出来的方式解决了:

PEMParser pemParser = new PEMParser(new BufferedReader(new InputStreamReader(certStream)));
Object pemCertObj = pemParser.readObject();
PemObject pemKeyObj = pemParser.readPemObject();

PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(pemKeyObj.getContent());
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(privKeySpec);

Security.addProvider(new BouncyCastleProvider());
X509CertificateHolder certHolder = (X509CertificateHolder)pemCertObj;
X509Certificate x509cert = (new JcaX509CertificateConverter()).setProvider("BC").getCertificate(certHolder);

当我在.getType()permCertObj上查看permKeyObj并分别返回RSA CERTRSA PRIVATE KEY时,我得到了提示。

无法找出readObject()readPemObject()

之间的差异

答案 1 :(得分:0)

PEMParser类将解析PEM格式的任何内容。您可以使用该解析器从文件中读取对象 - 如果您打印该对象的类,我会看到它是PEMKeyPair。可以使用JcaPEMKeyConverter将其转换为常规KeyPair。

public KeyPair importKeyFromPemFile(String filePath)
{
    try (FileReader reader = new FileReader(filePath))
    {
        PEMParser pemParser = new PEMParser(reader);
        PEMKeyPair pemKeyPair = (PEMKeyPair)pemParser.readObject()
        return new JcaPEMKeyConverter().getKeyPair(pemKeyPair);
    }
    catch (IOException | PEMException e)
    {
        throw new RuntimeException(e)
    }
}