在验证签名的上下文中,我想在签署文档时验证签名证书的有效性。我意识到如果我指定过去的日期,如果我使用当前时间或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吗?
答案 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的部分,因为您应该存储本地响应)