如何将 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,但私钥一直令人困惑。
如能帮助拼凑这些步骤,我们将不胜感激:
- 使用 PEMParser 打开 cert_pkey.pem 文件流
- 从 PemObject 获取 X509 证书(完成)
- 从 PemObject 获取私钥(如何?)
- 使用密码创建实例类型 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);
我在 permCertObj
和 permKeyObj
上查找 .getType()
时得到了提示,分别返回了 RSA CERT
和 RSA PRIVATE KEY
。
无法弄清楚 readObject()
和 readPemObject()
之间的区别
要将包含 x509 证书 + 私钥的 pem 文件转换为 pkcs12 (.p12) 文件,使用以下命令:
openssl pkcs12 -export -inkey cert_pkey.pem -in cert_pkey.pem -out cert.p12
我正在尝试使用 Java 和 BouncyCastle 库以编程方式完成相同的任务。我能够从 PEMObject 中提取 X509Cert,但私钥一直令人困惑。
如能帮助拼凑这些步骤,我们将不胜感激:
- 使用 PEMParser 打开 cert_pkey.pem 文件流
- 从 PemObject 获取 X509 证书(完成)
- 从 PemObject 获取私钥(如何?)
- 使用密码创建实例类型 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);
我在 permCertObj
和 permKeyObj
上查找 .getType()
时得到了提示,分别返回了 RSA CERT
和 RSA PRIVATE KEY
。
无法弄清楚 readObject()
和 readPemObject()