如何将 x509 证书和密钥转换为 pkcs12 文件

How to convert x509 Cert and Key to a pkcs12 file

要将包含 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. 使用密码创建实例类型 PKCS12 的 KeyStore

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

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)
    }
}

终于解决了如何分别获取证书和密钥的问题 - 不确定为什么会这样:

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);

我在 permCertObjpermKeyObj 上查找 .getType() 时得到了提示,分别返回了 RSA CERTRSA PRIVATE KEY

无法弄清楚 readObject()readPemObject()

之间的区别