根据Java中的自定义信任列表检查证书有效性
我有一份用CAdES数字签名的文件。我使用BouncyCastle API获取签名者的根据Java中的自定义信任列表检查证书有效性,java,security,x509certificate,Java,Security,X509certificate,我有一份用CAdES数字签名的文件。我使用BouncyCastle API获取签名者的X509Certificate[]实例,但假设该列表只包含一个元素 我需要在今天的日期验证此证书是否受信任,并且我不想使用系统的标准信任存储(通常用于信任SSL证书)。不,我想用类路径中的.cer文件列表建立我自己的信任列表。目前,单个CA是可信的,但很明显,将来可能会添加更多的证书 到目前为止,我已经阅读并尝试在代码中实现。我不需要SSLContext,我需要检查数字签名文档的有效性。我现在很困惑 X509T
X509Certificate[]
实例,但假设该列表只包含一个元素
我需要在今天的日期验证此证书是否受信任,并且我不想使用系统的标准信任存储(通常用于信任SSL证书)。不,我想用类路径中的.cer
文件列表建立我自己的信任列表。目前,单个CA是可信的,但很明显,将来可能会添加更多的证书
到目前为止,我已经阅读并尝试在代码中实现。我不需要SSLContext
,我需要检查数字签名文档的有效性。我现在很困惑
X509TrustManager
API只提供验证客户机/服务器证书的方法,但我的API只提供数字签名/不可否认使用标志
这些问题可以通过两种方式表述,从而得出相同的结论:
X509Certificate
实例的有效性从每个签名者的CAdES签名中提取签名者证书以及中间证书,作为
X509证书
列表。还构建一个包含所有根CA证书的集合
然后您可以使用这个(稍微调整)来验证并使用Java和BouncyCastle构建认证链。如果验证成功,它将返回认证链
public PKIXCertPathBuilderResult verifyCertificateChain(
X509Certificate cert,
Set<X509Certificate> trustedRootCerts,
Set<X509Certificate> intermediateCerts) throws GeneralSecurityException {
// Create the selector that specifies the starting certificate
X509CertSelector selector = new X509CertSelector();
selector.setCertificate(cert);
// Create the trust anchors (set of root CA certificates)
Set<TrustAnchor> trustAnchors = new HashSet<TrustAnchor>();
for (X509Certificate trustedRootCert : trustedRootCerts) {
trustAnchors.add(new TrustAnchor(trustedRootCert, null));
}
// Configure the PKIX certificate builder algorithm parameters
PKIXBuilderParameters pkixParams =
new PKIXBuilderParameters(trustAnchors, selector);
// Disable CRL checks (this is done manually as additional step)
pkixParams.setRevocationEnabled(false);
// Specify a list of intermediate certificates
// certificate itself has to be added to the list
intermediateCerts.add(cert);
CertStore intermediateCertStore = CertStore.getInstance("Collection",
new CollectionCertStoreParameters(intermediateCerts), "BC");
pkixParams.addCertStore(intermediateCertStore);
// Build and verify the certification chain
CertPathBuilder builder = CertPathBuilder.getInstance("PKIX", "BC");
PKIXCertPathBuilderResult result =
(PKIXCertPathBuilderResult) builder.build(pkixParams);
return result;
}
public PKIXCertPathBuilderResult verifyCertificateChain(
X509证书,
设置trustedRootCerts,
Set intermediateCerts)引发GeneralSecurityException{
//创建指定起始证书的选择器
X509CertSelector=新的X509CertSelector();
选择器。setCertificate(证书);
//创建信任锚(根CA证书集)
Set trustAnchors=newhashset();
对于(X509Certificate trustedRootCerts:trustedRootCerts){
添加(新信任锚(trustedRootCert,null));
}
//配置PKIX证书生成器算法参数
PKIXBuilderParameters pkixParams=
新的PKIXBuilderParameters(信任锚、选择器);
//禁用CRL检查(这是作为附加步骤手动完成的)
pkixParams.setRevocationEnabled(false);
//指定中间证书的列表
//必须将证书本身添加到列表中
中级证书。添加(证书);
CertStore intermediateCertStore=CertStore.getInstance(“集合”,
新集合CertStoreParameters(intermediateCerts),“BC”);
pkixParams.addCertStore(intermediateCertStore);
//建立并验证认证链
CertPathBuilder=CertPathBuilder.getInstance(“PKIX”、“BC”);
PKIXCertPathBuilderResult结果=
(PKIXCertPathBuilderResult)builder.build(pkixParams);
返回结果;
}
如果您不想处理CAdES的复杂性,我建议您使用开源项目幸运的是,BouncyCastle通过提取签名者证书和文档哈希代码HMMM,为我处理CAdES的复杂性提供了很多帮助。。。不管怎样,我总是会遇到一个异常,“找不到与targetConstraints匹配的证书”。我试图从系统信任存储中加载trustedRootCerts,其中包含目标根CA(调试,我在内存存储中找到了正确的证书)。证书本身必须添加到中间列表
intermediateCerts.add(cert)代码>我链接的代码不正确。我已经用原始资料更新了链接。你能检查修改后的答案吗?将在接下来的几天内完成。目前,我通过假设路径长度始终为1(用户证书未由中间CA签名)解决了整个问题。作为大多数开发商,我落后于进度:-(