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.enableCRLDPcom.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 分发点作为替代,您也会得到一个例外。

无论如何期待更优雅的答案