如何在java中设置默认CRL路径。就像现在不包含CRL分发点的证书一样,我得到了这个:
PKIX path validation failed: java.security.cert.CertPathValidatorException: Could not determine revocation status
我已尝试将 com.sun.security.enableCRLDP 和 com.sun.net.ssl.checkRevocation 的组合与包含CRLDP但未包含CRLDP的证书组合在一起。结论是,当您设置上述属性但是您拥有不包含CRLDP的证书时,您会得到一个例外,即' 不是我想要的当前系统的行为。
答案 0 :(得分:0)
我想我找到了一种指定本地CRL文件的方法,它似乎可以解决问题。
// initialize a new TMF with our keyStore
TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX", "SunJSSE");
CertPathParameters pkixParams = new PKIXBuilderParameters(keyStore, new X509CertSelector());
// Activate certificate revocation checking
((PKIXBuilderParameters) pkixParams).setRevocationEnabled(true);
List<CertStore> certStores = new ArrayList<>(1);
Collection<CRL> crls = new HashSet<>(1);
crls.add(CertificateFactory.getInstance("X.509").generateCRL( new java.io.FileInputStream("your_local_file.crl")));
certStores.add(CertStore.getInstance("Collection", new CollectionCertStoreParameters(crls)));
((PKIXBuilderParameters) pkixParams).setCertStores(certStores);
System.setProperty("com.sun.security.enableCRLDP", "true");
tmf.init(new CertPathTrustManagerParameters(pkixParams));
// acquire X509 trust manager from factory
TrustManager tms[] = tmf.getTrustManagers();
for (TrustManager tm : tms) {
if (tm instanceof X509TrustManager) {
trustManager = (X509TrustManager) tm;
break;
}
}
在这种情况下,如果证书不包含CRL分发点,它将不会抛出异常,并将尝试从我给出的文件中确定撤销状态。但是,如果指定的本地CRL文件的内容格式不正确,它将不会跳过,即使您的证书包含CRL分发点作为替代,您也会得到异常。
无论如何都期待更优雅的答案。