![](/img/trans.png)
[英]BouncyCastleProvider do not get PrivateKey and certificate chain from PKCS#12 file
[英]How do you convert PKCS#12 String to Certificate and PrivateKey?
我从存储在 Azure Key Vault 中的证书中收到以下字符串。 我正在使用 Secret API 来检索与此证书相关的证书和私钥。
最初,证书是使用 .pfx 文件上传到 Azure 密钥库的。 现在我需要创建一个证书和一个 PrivateKey 以允许对第 3 方系统进行客户端身份验证,并且我正在使用从 API 检索到的给定字符串,但是我注意到如何在 Java 中解决这个问题。
我从 C# 中的这个链接中得到了一些提示,但是我很确定这种方法在 Java 中不起作用。 特别是 X509Certificate 或一般证书不包含有关 Java 中的 PrivateKey 的任何信息,这与 C# 不同,我不知道如何从 ZD523872880E1EA223817A 中的给定字符串中提取该信息。
这可以按预期从从 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...
是的,Java X509Certificate
和Certificate
只是证书。 而是使用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 提供整个密钥库 object 而不是单个部分(私钥和证书)。 与验证 TLS/SSL 中的对等点类似,您为 TrustManager 提供了一个包含受信任证书的密钥库,通常是根 CA,并且通常默认为一组内置的公共根 CA。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.