【问题标题】:How get X509 certificate's full cert chain programatically?如何以编程方式获取 X509 证书的完整证书链?
【发布时间】:2015-08-22 05:35:50
【问题描述】:

假设我有 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,如 here 所示。

如果我真的需要如上所述获取链,是否有任何库已经这样做了?有什么办法可以用 std lib 做到这一点?我没有找到 bouncycastle 示例和 java 的标准库代码,如

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

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

【问题讨论】:

  • 请将您的帖子缩小到一个问题。
  • @DeerHunter,我排除了一些问题。

标签: certificate certificate-authority java validation


【解决方案1】:

Nitpick:您肯定是指keytool -printcert(带连字符,不带空格,-v 此处不需要)。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多