如何以编程方式获取 X509 证书的完整证书链?

How get X509 certificate's full cert chain programatically?

假设我有私钥的 p12 容器和 public 证书。当我使用 Java 密钥工具将 p12 public 证书导出到单独的 .cer 文件时,我可能会单击到 .cer 文件并查看完整的证书链。我如何以编程方式获得完整路径?

我几乎没有调查。我使用 keytool 的 print cert -v 命令并看到 属性 AuthorityInfoAccess 和 sub属性

accessMethod: caIssuers
accessLocation: URIName: http://.../some.crt

我下载了 some.crt(它是 PEM 证书),然后再次使用 print cert -v 并再次看到 accessLocation: URIName: http://.../some2.crt 并重复下载 .crt 文件并获得 parent 直到到达没有这样的根 .crt 属性.

我认为,我应该按照上面的描述以编程方式下载链并将其提供给 CertPathValidator,如图 here

如果我真的需要像上面描述的那样获取链,是否有图书馆已经这样做了?有什么办法可以用 std lib 来实现吗?我没有找到 bouncycastle 示例和 java 的标准库代码,例如

java.security.cert.Certificate[] cchain = keystore.getCertificateChain(alias);

returns 一个证书条目实际上有 2 个“parents”。

吹毛求疵:您肯定是指 keytool -printcert(带连字符,不带 space,此处不需要 -v)。

由 Java 在 JKS 或 PKCS12 中创建的私钥条目通常包含完整链,但 keytool -exportcert 提取 叶证书。 由其他东西创建的 PKCS12 可能包含或不包含完整链,这可能取决于您在创建它时单击的内容。 如果链在那里,KeyStore.getCertificateChain returns它,keytool -list -v(这里-v很重要)显示它。

如果证书作为受信任的证书条目导入或重新导入——通常在 JKS 中,PKCS12 不是为单独的证书设计的——它从不包含链,所以 getCertificateChain 在该条目上 将不起作用,但 IIRC CertPathBuilder 可以在一个商店中构建一个组合多个受信任证书条目的链。

如果您确实需要 parent(链)证书 您还没有,并且 child 指定 AIA.caIssuers,那么使用它来获取是明智的。 我很确定标准 Java (JRE) 库中没有任何东西可以为您做这件事,至少到目前为止是这样;我不知道 BouncyCastle 或其他任何人。