【问题标题】:Get CA certificates from p12 file programmatically and order certificate list?以编程方式从 p12 文件中获取 CA 证书并订购证书列表?
【发布时间】:2017-03-23 14:31:34
【问题描述】:

经过大量搜索,我没有找到如何在 Java 代码中等效于以下命令:

openssl pkcs12 -cacerts -in /path/to/file.p12 -noout

仅从该 p12 获取 ca 证书或 openssl pkcs12 -clcerts -in /path/to/file.p12 -noout 获得证书

在 java 中,我加载 file.p12,因此所有这些证书都存储在 PKCS12 密钥库中,但无法区分哪个是 CA 证书,哪个是简单证书。该怎么做?

(在我的 p12 中,我有我的证书和 N CA 证书,它们已经签名: CA 2 已签署证书,CA 3 已签署 CA 2 证书...,CA N 已签署 CA N-1 证书)

2) 以同样的方式提出另一个问题: 有没有办法订购 x509 证书列表来获取 (ca 1, ... ca N),我用过:

CertificateFactory certFact = CertificateFactory.getInstance("X.509");
CertPath path = certFact.generateCertPath(myCertifList);

但是列表需要按照与我希望相反的顺序排列。

3) 全链证书订单是否有保证?例如,如果 Let's Encrypt 改变它的策略并改变构建链和全链的方式,我们不能依赖实际的证书订单怎么办? 非常感谢您的帮助!

【问题讨论】:

  • 根 CA 证书是自签名的。自定义自签名证书的主要区别在于它们列在 Java 的受信任证书存储中。另请参阅this question

标签: java openssl x509certificate keystore ca


【解决方案1】:

发出 P12 的实际方式是:使用单个 PrivateKey 和对应的 Certificate Chain(通用互联网标准)。

您可以在以下链接中了解更多信息:PKCS#12Chain of TrustIntermedial CA

通常(几乎一直),用户的证书将是链中的第一个证书(最重要),其次是最不重要的证书(子 CA 和 CA,CA 是最后一个)。

几乎所有的软件和库都遵循这种方法。

因此,可以肯定地说证书链将被订购(但是,链可能不完整,您只能拥有用户的证书,或者之后 CA 证书可能不存在Sub CA 的证书。这高度依赖于颁发 P12/Certificate 链的 CA)。但是,您会在第一个(第零个)位置找到用户的证书。

如果您需要确保链条完整且有序,您可以使用自己的防御方法来执行此操作。您可以根据证书的SubjectDNIssuerDN 字段来识别证书的类型(CA、SubCA 或用户)。

如果SubjectDN等于IssuerDN,那么它就是一个CA证书,然后识别下一个证书(SubCA),如果证书的IssuerDN等于SubjectDN,那么它就是CA链中的下一个,依此类推..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2015-08-22
    • 2016-05-20
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多