x509certificate certpath验证

时间:2011-03-08 20:31:07

标签: java security tomcat x509certificate pki

我们的用例要求在PKIX设置上通过OCSP验证证书撤销。我的出发点是这个相关问题的代码:OCSP Revocation on client certificate

我在应用程序级别手动执行,因为tomcat不支持它。但是,我在构建certPath时遇到了一些麻烦,我想我缺少一些基本的理解。

首先,我尝试为传入的客户端x509Certificate创建certPath。

KeyStore存储已正确初始化,仅包含与客户端x509Certificate匹配的根证书。

编辑:我在添加中间证书后得到了相同的结果。

X509CertSelector certSelector = new X509CertSelector();
certSelector.setSubject(x509certificate.getSubjectX500Principal());
PKIXParameters params = new PKIXBuilderParameters(store,certSelector);
CertPathBuilder cpb = CertPathBuilder.getInstance(CertPathBuilder.getDefaultType());
CertPath certPath = cpb.build(params).getCertPath();

但是,我在运行时遇到错误:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

可能缺少什么?

2 个答案:

答案 0 :(得分:3)

正如您所知,我不确定CPB如何找到主题证书(x509certificate)来构建路径,除非它在您的密钥库中,它通常不会。仅提供主题名称不足以构建经过验证的路径;发现与发现验证算法需要完整的主题证书。看看如果替换

会发生什么
certSelector.setSubject(x509certificate.getSubjectX500Principal());

certSelector.setCertificate(x509certificate);

答案 1 :(得分:3)

您表明您添加了中间体证书。由于您没有更新您的代码段,我想知道如何添加这些证书?您应该将这些证书添加为CertStore

X509CertSelector certSelector = new X509CertSelector();
certSelector.setSubject(x509certificate.getSubjectX500Principal());
PKIXParameters params = new PKIXBuilderParameters(store,certSelector);
CertStore cstore = CertStore.getInstance("Collection", new CollectionCertStoreParameters(Arrays.asList(icert1, icert2 /*, other certs... */)));
params.addCertStore(cstore);
CertPathBuilder cpb = CertPathBuilder.getInstance(CertPathBuilder.getDefaultType());
CertPath certPath = cpb.build(params).getCertPath();