我试图从smime.p7s文件中读取证书,证书链是:
Baltimora Cyber Trust - > DigitPA - > Aruba PEC
因此,当我试图提取时,我只检索最后两个证书,最后一个像主题,第一个像发行者。 我错了什么?
代码:
private List<CertificateInfo> reading(ASN1InputStream asn1Stream) throws IOException, CMSException, CertificateException {
ArrayList<CertificateInfo> infos = new ArrayList<CertificateInfo>();
ASN1Primitive obj = asn1Stream.readObject();
ContentInfo contentInfo = ContentInfo.getInstance(obj);
CMSSignedData cms = new CMSSignedData(contentInfo);
JcaX509CertificateConverter converter = new JcaX509CertificateConverter().setProvider(BouncyCastleProvider.PROVIDER_NAME);
Store store = cms.getCertificates();
SignerInformationStore signersInfoStore = cms.getSignerInfos();
Collection<SignerInformation> signers = signersInfoStore.getSigners();
logger.debug("signers num [" + signers.size() + "]");
for (SignerInformation si : signers) {
SignerId sid = si.getSID();
Collection<X509CertificateHolder> holders = store.getMatches(sid);
logger.debug("holders num [" + holders.size() + "]");
for (X509CertificateHolder certholder : holders) {
X509Certificate cert = converter.getCertificate(certholder);
logger.debug("Issuer [" + cert.getPublicKey() + "]");
CertificateInfo certInfo = util.parse(cert);
infos.add(certInfo);
}
}
return infos;
}
我使用这些充满活力的城堡罐子就像是家属:
<dependency>
<groupId>bouncycastle</groupId>
<artifactId>bcprov-jdk15</artifactId>
<version>150</version>
</dependency>
<dependency>
<groupId>bouncycastle</groupId>
<artifactId>bcmail-jdk15</artifactId>
<version>150</version>
</dependency>
<dependency>
<groupId>bouncycastle</groupId>
<artifactId>bcpg-jdk15</artifactId>
<version>150</version>
</dependency>
<dependency>
<groupId>bouncycastle</groupId>
<artifactId>bcpkix-jdk15</artifactId>
<version>150</version>
</dependency>
提前感谢。
答案 0 :(得分:0)
可能没有错。 PKI使用树状结构。可以使用DigitPA信任Aruba PEC。但你怎么能相信DigitPA?最常用的方法是将根证书存储在信任库中。这个信托商店是例如由应用程序分发(如Web浏览器中的信任存储)。
现在,如果Baltimora Cyber Trust已经在信托商店,则无需在PKCS#7容器内发送。证书链可以在没有它的情况下构建到受信任的根目录。
因此,您可以直接从信任存储区读取证书,也可以从为验证而创建的证书链中检索根证书。