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

3

假设我有一个包含私钥和公钥证书的p12容器。当我使用Java keytool将p12公共证书导出到单独的.cer文件时,我可以单击.cer文件并查看完整的证书链。如何在程序中以编程方式获取完整路径?

我进行了一些调查。我使用了keytool的print cert -v命令,并看到了属性AuthorityInfoAccess及其子属性。

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

我下载了一个名为some.crt(它是PEM证书),然后再次使用print cert -v,看到了accessLocation: URIName: http://.../some2.crt,并重复下载.crt文件并获取父级,直到达到没有此属性的根.crt。

我认为,我应该像上面描述的那样以编程方式下载链,并将其提供给CertPathValidator,如这里所示。

如果我真的需要按照上述方式获取链,是否已经有任何库可以实现这一点?是否有使用std lib的方法?我没有找到bouncycastle的示例和Java标准库代码,例如

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

返回实际具有2个“父级”的证书的一个条目。


3
请将您的帖子缩小到一个问题。 - Deer Hunter
@DeerHunter,我删除了一些问题。 - user2104560
1个回答

1
Nitpick:你一定是指keytool -printcert(用连字符,不要空格,这里不需要-v)。
Java在JKS或PKCS12中创建的私钥条目通常包含完整的证书链,但keytool -exportcert仅提取叶子证书。由其他东西创建的PKCS12可能包含完整的证书链,也可能不包含,可能取决于创建时单击了什么。如果存在证书链,则KeyStore.getCertificateChain将返回它,并且keytool -list -v(这里-v很重要)会显示它。
如果将证书作为受信任的证书条目导入或重新导入--通常在JKS中,PKCS12不适合用于单独的证书--那么该条目永远不包含链,因此getCertificateChain在该条目上无法工作,但是我记得CertPathBuilder可以构建结合一个存储中的多个受信任证书条目的链。
如果您需要一个之前没有的父(链)证书,并且子项指定了AIA.caIssuers,则使用它来获取是明智的。我很确定标准Java(JRE)库中没有任何东西可以为您完成此操作,至少目前还没有;我不知道BouncyCastle或其他任何人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接