使用CertPathValidator进行签名验证,包括CRL撤销

时间:2018-03-14 21:38:26

标签: java date digital-signature certificate-revocation

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

 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吗?

1 个答案:

答案 0 :(得分:1)

证书颁发机构仅具有证书的当前状态。无法在过去的日期请求状态:CA可能已删除在该日期发布的CRL,甚至在证书已过期时已清除所有已清除的记录

因此只能使用当天发布的CRL或OCSP执行过去时间验证。您需要保留撤销证据以及将来使用的签名。(有特定的数字签名格式设计用于包含撤销证据,如AdES)

我怀疑CertPathValidator的基础实现是在提供过去日期时禁用CRL请求。请注意,PKIX未定义应如何检查吊销。请参阅官方Java安全性guide

  

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的部分,因为您应该存储本地响应)