要将包含x509证书+私钥的pem文件转换为pkcs12(.p12)文件,请使用以下命令:
openssl pkcs12 -export -inkey cert_pkey.pem -in cert_pkey.pem -out cert.p12
我正在尝试使用Java和BouncyCastle库以编程方式完成相同的操作。我能够从PEMObject中提取X509Cert,但私钥一直令人困惑。
对拼凑这些步骤的任何帮助表示赞赏:
答案 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 CERT
和RSA 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)
}
}