【发布时间】:2017-10-08 17:15:06
【问题描述】:
我仍然是密码学的菜鸟,我每天都会偶然发现一些简单的事情。而今天只是其中之一。
我想用 bouncy castle 库验证 java 中的 smime 消息,我想我几乎想通了,但此时的问题是 PKIXparameters 对象的构建。 假设我有一个具有以下结构的最终实体 x509certificate:
root certificate
+->intermediate certificate
+->end-entity certificate
为了验证消息,我需要先建立信任链,但我不知道如何从终端实体中提取根证书和中间证书。
我尝试以 root 身份使用终端实体,但没有成功:
InputStream isCert = GetFISCertificate();
List list = new ArrayList();
X509Certificate rootCert = (X509Certificate) certificateFactory.generateCertificate(isCert);
list.add(rootCert);
CollectionCertStoreParameters params = new CollectionCertStoreParameters(list);
CertStore store = CertStore.getInstance("Collection", params, BC);
//create cert path
List certChain = new ArrayList();
certChain.add(rootCert);
CertPath certPath = certificateFactory.generateCertPath(certChain);
Set trust = Collections.singleton(new TrustAnchor(rootCert, null));
//validation
CertPathValidator certPathValidator = CertPathValidator.getInstance("PKIX", BC);
PKIXParameters pKIXParameters = new PKIXParameters(trust);
pKIXParameters.addCertStore(store);
pKIXParameters.setDate(new Date());
try {
CertPathValidatorResult result = certPathValidator.validate(certPath, pKIXParameters);
System.out.println("certificate path validated");
} catch (CertPathValidatorException e) {
System.out.println("validation failed on certificate number " + e.getIndex() + ", details: " + e.getMessage());
}
遇到了这个异常:
validation failed on certificate number -1, details: Trust anchor for certification path not found.
顺便说一句,我可以只使用最终实体证书来验证消息,就好像它是自签名证书一样?
【问题讨论】:
标签: java x509certificate bouncycastle