2

我们的用例需要在 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

可能缺少什么?

4

2 回答 2

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();
于 2011-03-18T18:06:43.120 回答
3

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

certSelector.setSubject(x509certificate.getSubjectX500Principal());

certSelector.setCertificate(x509certificate);
于 2011-03-09T04:07:54.377 回答