Java为CRL路径设置默认值

时间:2016-12-08 12:58:14

标签: java ssl ssl-certificate x509certificate certificate-revocation

如何在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的证书时,您会得到一个例外,即' 不是我想要的当前系统的行为。

1 个答案:

答案 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分发点作为替代,您也会得到异常。

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