如何将PKCS#12字符串转换为证书和私钥



我正在从存储在Azure密钥库中的证书接收以下字符串。我正在使用Secret API来检索证书和与此证书相关的私钥。

最初,证书是使用.pfx文件上载到Azure密钥保管库的。现在,我需要创建一个证书和一个PrivateKey,以允许对第三方系统进行客户端身份验证,并且我正在使用从API检索的给定字符串,但我不知道如何在Java中绕过这一点。

我从C#中的这个链接中得到了一些提示,但我很确定这个方法在Java中的工作方式与此不同。特别是X509Certificate或Certificate在Java中通常不包含任何关于PrivateKey的信息,这与C#不同,我不知道如何从Java中的给定String中提取这些信息。

这与从API 检索的字符串中检索证书的预期工作一样

String secret = azureSecret.getValue();
byte[] certkey = Base64.getDecoder().decode(secret);
ByteArrayInputStream inputStream = new ByteArrayInputStream(certkey);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate cert = cf.generateCertificate(inputStream);

azureSecret.getValue()格式如下,但我不确定如何从给定的字符串中获取PrivateKey

MIIKvgIBaaZd6Euf3EYwYdHrIIKYzCC...

YES,JavaX509CertificateCertificate只是证书请使用KeyStore,它可以包含多个条目,每个条目都是一个"可信"证书(针对其他人(,或者一个私钥加证书加其他链证书(如果适用(,或者(此处不相关(一个"秘密"(对称(密钥。PKCS12作为一种类型的KeyStore和其他不相关的类型被支持,所以在base64解码之后,你已经做了一些类似的事情:

KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(inputstreamfromvaultvalue, password);
// then
PrivateKey pkey = (PrivateKey) ks.getKey(alias, password);
// and
Certificate cert = ks.getCertificate(alias); // if you only need the leaf cert
// or
Certificate[] chain = ks.getCertificateChain(alias); // usually

但是,如果您想在TLS/SSL(包括HTTPS(中进行客户端身份验证,则需要向JSSE KeyManager提供整个密钥库对象,而不是单个密钥(私钥和证书(。与验证TLS/SSL中的对等方类似,您为TrustManager提供了一个包含受信任证书的密钥库,通常是根CA,通常默认为一组内置的公共根CA。

最新更新