2

在验证签名的上下文中,我想在文档签名时验证签名证书的有效性。我意识到如果我指定过去的日期,则不使用 CRL 吊销检查方法,而如果我使用当前时间或 null,则吊销检查工作正常。我正在使用下一个代码

 CertificateFactory cf = CertificateFactory.getInstance( "X.509" );
 CertPath certPath =    cf.generateCertPath( certs );
 CertPathValidator cpv = CertPathValidator.getInstance( "PKIX", "SUN" );
PKIXParameters params = new PKIXParameters( ks );
params.setDate( signingTime );
params.setRevocationEnabled( true );                
cpvResult = (PKIXCertPathValidatorResult) cpv.validate( certPath, params ); 

我已经启用了系统属性 EnabledCRLDP。此外,OCSP 不是一个通用的解决方案,因为它不起作用的是一些证书。

在过去的时间验证中是否有某些理由不使用 CRL 撤销方法?

在这种情况下,有什么方法可以强制使用 CRL?

4

1 回答 1

1

证书颁发机构只有证书的当前状态。无法请求过去某个日期的状态:CA 可能已删除该日期颁发的 CRL,或者如果证书已过期,甚至所有记录都已被清除

因此,过去时间验证只能使用在该日期发布的 CRL 或 OCSP 执行。您需要将撤销证据与签名一起保留以供将来使用。(有特定的数字签名格式旨在包含撤销证据,如 AdES)

CertPathValidator如果提供了过去的日期,我怀疑底层实现是禁用 CRL 请求。请注意,PKIX 没有定义应如何检查吊销。请参阅官方 Java 安全指南

setRevocationEnabled方法允许调用者禁用撤销检查。默认情况下启用撤销检查,因为它是 PKIX 验证算法的必需检查。但是,PKIX 没有定义应如何检查吊销。例如,实现可以使用 CRL 或 OCSP。

使用 java 8,您可以使用设置所需的 CRL 和/或 OCSP 响应集

 params.setCertStores(certStoreList);. //store containing crls
 PKIXRevocationChecker rc =  (PKIXRevocationChecker)cpv.getRevocationChecker();
 rc.setOcspResponses(responses)

但是正如您所说,此方法不适用于 java 6,因此我认为您可以在验证证书链后禁用吊销检查并手动实施 OCSP 和 CRL 验证。

例如,使用它来验证使用 CRL 的证书

CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509CRL crl = (X509CRL)cf.generateCRL(inStream); 
crl.isRevoked(certificate);

可以使用 bouncycastle 处理 OCSP 响应。请参阅此问题OCSP response does not give Certificate Status(省略请求 ocsp 的部分,因为您应该存储本地响应)

于 2018-03-18T10:49:14.447 回答