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 个“父母”的证书条目。

4

1 回答 1

1

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

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

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

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

于 2015-06-11T09:01:20.803 回答