x509certificate certpathvalidation

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

我在应用程序级别手动执行它,因为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 

可能会遗漏什么?

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

 certSelector.setSubject(x509certificate.getSubjectX500Principal()); 

 certSelector.setCertificate(x509certificate); 

您表明您添加了中间体证书。 由于您没有更新您的代码段,我想知道如何添加这些证书? 您应该将这些证书添加为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();