Java 设置 CRL 路径的默认值
Java set default value for CRL path
如何在 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 的证书时,您会得到一个异常,即
这不是我当前系统想要的行为。
我想我找到了一种指定本地 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 分发点作为替代,您也会得到一个例外。
无论如何期待更优雅的答案
如何在 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 的证书时,您会得到一个异常,即 这不是我当前系统想要的行为。
我想我找到了一种指定本地 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 分发点作为替代,您也会得到一个例外。
无论如何期待更优雅的答案