有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java SSL证书撤销检查

我目前正在使用SSL编写一个网络TCP服务器。在生产中,我们最终将要求客户端使用证书进行身份验证

为了在紧急情况下撤销证书,我们还希望建立一个CRL

我的问题是:Java是立即检查CRL(如果提供了证书),还是需要手动实现这样的检查

为了进行测试,我准备了一个带有CRL集的证书,但Java似乎没有尝试验证它(我将其放入了本地web服务器,无法访问)

我只找到了com。太阳网ssl。checkRevocation=trueVM选项,但显然它不会查询CRL。虚拟机调试设置为java。安全debug=certpath也不会生成任何输出

Java的子系统中似乎有相关的类(例如,Java.security.cert.X509CRLSelector),但显然它没有发挥作用

编辑:删除过时的Dropbox链接


共 (3) 个答案

  1. # 1 楼答案

    OCSP对你合适吗

    下面的代码为我启用OCSP:

    // for debugging:
    System.setProperty("javax.net.debug", "all");
    System.setProperty("java.security.debug", "all");
    
    System.setProperty("com.sun.net.ssl.checkRevocation", "true");
    Security.setProperty("ocsp.enable", "true");
    

    在CRL上失败,错误如下:How to check revocation status of X509Certificate chain using JAVA?

  2. # 2 楼答案

    首先,您可以在jcontrol(1.8版)中配置的撤销检查仅适用于appletWebStart下载和签名者证书检查! 对于已编程的https客户端,您可以使用上面提到的PKIXRevocationChecker,但根据我的经验,Oracle实现根本不支持LDAP CDP下载。 当我遇到这个问题时,我需要使用CRL实现完整的证书链检查,并在自定义TrustManager的checkXXXX函数后面立即从LDAP下载CA证书

  3. # 3 楼答案

    请注意,禁用撤销检查是一种糟糕的安全做法。你可以做到,但一定要知道风险所在

    currently accepted answerby@DoNuT通过设置PKIXRevocationChecker.Option.SOFT_FAIL来工作,这会导致验证器即使撤销检查失败也不会抛出异常。下面的答案完全禁用了撤销检查,因此在根本不需要验证的情况下会更快。这是因为执行撤销检查需要联系CRL分发点或OCSP服务器,如果您不想这样做,则无需支付费用

    只需在类型为PKIXBuilderParameters的对象上使用setRevocationEnabled(false)

    // Initialize "anchors" to trusted certificates
    // Initialize "selector" to the certificate you want to validate
    PKIXBuilderParameters pbParams = new PKIXBuilderParameters(anchors, selector);
    
    pbParams.setRevocationEnabled(false); // disable revocation check
    
    CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");
    CertPathBuilderResult cpbResult = cpb.build(pbParams);
    
    CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
    CertPathValidatorResult result = cpv.validate(cpbResult.getCertPath(), pbParams);
    
    System.out.println(result);