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

时间:2015-06-05 06:52:28

标签: certificate certificate-authority java validation

想象一下,我有私人密钥和公共证书的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文件和geting parent,直到达到没有此类属性的root .crt。

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

如果我真的需要像上面描述的那样获得链,是否有任何图书馆已经这样做了?有没有办法用std lib 做到这一点?我没有找到bouncycastle示例和java的标准库代码,如

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

返回一个实际拥有2" parent"的证书条目。

1 个答案:

答案 0 :(得分:1)

Nitpick:你肯定是keytool -printcert(带连字符,没有空格,这里不需要-v)。

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

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

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