我正在使用充气城堡离线验证 X509 证书,并且遇到了旧 CRL 的问题。我还没有发现接受过期的 CRL 的可能性,在我看来,如果证书被吊销,它应该在 CRL 到期后保持吊销状态。此外,如果 CRL 为空,我只想接受这一点,此时我无法获得更新的 CRL。
只是为了澄清,这将是用例:
- 2015年创建证书,有效期2015-2020
- 在 2017 年用 CRL 吊销证书,密钥被盗,只创建了 1 年的 CRL,因为我犯了一个错误或计划滚动并且永远不会解决它
- 检查2019年的证书,CRL过期了,bouncy castle再次接受被吊销的证书——这显然不是我想要的
目前我将撤销检查设置为 false 并自己执行检查。我在任何地方都没有在网上找到任何关于此的内容。
这是我的代码:
final X509CertSelector endConstraints = new X509CertSelector();
endConstraints.setSerialNumber(signer.getSID().getSerialNumber());
final PKIXBuilderParameters buildParams = new PKIXBuilderParameters(trustAnchors, endConstraints);
//a CertStore object with Certificates and CRLs
buildParams.addCertStore(certificates);
//currently deactivated
buildParams.setRevocationEnabled(false);
final CertPathBuilder builder = CertPathBuilder.getInstance(SignedFileVerifier.CERTIFICATE_PATH_ALGORITHM, SignedFileVerifier.PROVIDER);
final CertPathBuilderResult result = builder.build(buildParams);
//here I manually check the CRLs, which I don't want to do
checkRevocation(result.getCertPath().getCertificates(), certificates, trustAnchors);
//if this passes I return the found certificate
return (X509Certificate) result.getCertPath().getCertificates().get(0);
确切的例外是:
Caused by: org.bouncycastle.jce.exception.ExtCertPathValidatorException: No CRLs found for issuer "cn=goodOldIssuerCA0,ou=jUnit Test Issuer,o=BOGO Company,c=AT"
at org.bouncycastle.jce.provider.RFC3280CertPathUtilities.processCertA(Unknown Source)
at org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(Unknown Source)
at org.bouncycastle.jce.provider.PKIXCertPathBuilderSpi.build(Unknown Source)
at org.bouncycastle.jce.provider.PKIXCertPathBuilderSpi.build(Unknown Source)
...