1

我正在使用 Java 实现使用 CRL 进行撤销检查,类似于以下代码(我将代码剪裁得简洁明了)

    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");
    PKIXRevocationChecker rc = (PKIXRevocationChecker)cpb.getRevocationChecker();

    rc.setOptions(EnumSet.of(
            PKIXRevocationChecker.Option.PREFER_CRLS,
            PKIXRevocationChecker.Option.ONLY_END_ENTITY,
            PKIXRevocationChecker.Option.NO_FALLBACK,
            PKIXRevocationChecker.Option.SOFT_FAIL)); 

    PKIXBuilderParameters pkixParams = 
            new PKIXBuilderParameters(getTrustStore(), new X509CertSelector());
    pkixParams.setRevocationEnabled(false);
    pkixParams.addCertPathChecker(rc);
    tmf.init(new CertPathTrustManagerParameters(pkixParams));

    SSLContext contect = SSLContext.getInstance("TLSv1.2");
    context.init(null, getTrustManagers(), null);
    defaultFactory = context.getSocketFactory();

上面的代码在自定义 SSLSocketFactory 的构造函数中,并且有一个自定义的 TrustManager(由 getTrustManagers() 返回)覆盖 checkServerTrusted() 以执行一些证书检查并在最后执行默认的 checkServerTrusted()。一切正常,除了我需要 CRL 的验证在它由没有设置 cRLsign 密钥使用位的 CA 签名时失败,但它没有。

我知道这是 RFC3280 的要求,在网上某处我读到 Java 实现符合 RFC,我什至看到了 Java 基本代码中的方法来做到这一点,但它似乎并没有发挥作用我运行应用程序。

我使用自定义代码进行了所有吊销检查以实现这一目标,但我认为 Java 实现比我的自定义代码更完整,我更喜欢使用 Java 实现。

有什么解决办法吗?

4

0 回答 0