2016-11-09 48 views
2

后吨搜索,我没有找到如何使等同于Java代码以下命令:以编程方式从p12文件获取CA证书并订购证书列表?

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

只得到CA从此P12或 OpenSSL的PKCS12 -clcerts -in /路/证书/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)是否有充足的证书订单保证?如果让我们加密例如改变它的策略,并改变方式来建立链和全链的方式,我们不能依赖实际的证书订单? 非常感谢您的帮助!

+0

根CA证书是自签名的。自定义自签名证书的主要区别在于它们列在Java的受信任证书库中。另见[这个问题](http:// stackoverflow。COM /问题/ 3508050 /何灿I-GET-A-列表的信任根,证书,在Java的)。 – Robert

回答

0

P12签发的实际方式是:单一的PrivateKey和相应的Certificate Chain(通用互联网标准)。

你可以在这些链接中阅读更多关于此:PKCS#12Chain of TrustIntermedial CA

通常(几乎所有的时间),用户的证书将是链中的第一个证书(最重要的),其次是最不重要的证书(Sub CA和CA's,CA是最后一个证书)。

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

因此,可以肯定的是,证书链将被命令(然而,有可能链不完整,你可能只有用户的证书,或CA证书可能不会在那里后Sub CA的证书,这很大程度上取决于发布P12 /证书链的CA.但是,您会在第一个(第零)位置找到用户的证书。

如果你需要确保链条是完整的和有序的,你可以有自己的防御方法来做到这一点。您可以根据证书的SubjectDNIssuerDN字段来识别证书类型(CA,SubCA或用户)。

如果SubjectDN等于IssuerDN,那么它是一个CA证书,然后确定下一个证书(SUBCA),如果证书的IssuerDN等于CA的SubjectDN,那么它是在链中的下一个,以此类推on ..