Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenJDK 11中启用SSL证书吊销检查_Ssl_Ssl Certificate_Java 11_Certificate Revocation - Fatal编程技术网

在OpenJDK 11中启用SSL证书吊销检查

在OpenJDK 11中启用SSL证书吊销检查,ssl,ssl-certificate,java-11,certificate-revocation,Ssl,Ssl Certificate,Java 11,Certificate Revocation,Java11中是否有一些快速的“声明式”方法,而不是繁琐的手动实现,来启用证书是否被吊销的检查 我尝试使用此答案中的属性: 使用此虚拟吊销证书: 但是代码总是接受证书。我是否做错了什么,或者这些属性对于Java11不再实际?如果有的话,我们还有其他选择吗 下面是我的代码: public static void validateOnCertificateRevocation(boolean check) { if (check) { System.setProperty("

Java11中是否有一些快速的“声明式”方法,而不是繁琐的手动实现,来启用证书是否被吊销的检查

我尝试使用此答案中的属性: 使用此虚拟吊销证书: 但是代码总是接受证书。我是否做错了什么,或者这些属性对于Java11不再实际?如果有的话,我们还有其他选择吗

下面是我的代码:

public static void validateOnCertificateRevocation(boolean check) {
    if (check) {
        System.setProperty("com.sun.net.ssl.checkRevocation", "true");
        System.setProperty("com.sun.security.enableCRLDP", "true");

        Security.setProperty("ocsp.enable", "true");
    }

    try {
        new URL("https://revoked.badssl.com").openConnection().connect();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

似乎必须在执行第一个请求之前设置这些选项

因此,以下代码作为独立Java程序引发了一个
CertPathValidator异常:证书已被吊销
(在Windows上使用OpenJDK 11.0.2 x64进行测试):

但是,以下代码不会导致任何错误/异常:

public static void main(String[] args) {
    validateOnCertificateRevocation(false);
    validateOnCertificateRevocation(true); // nothing happens
}
您可以看到,在处理第一个请求后更改选项是无效的。我假设这些选项是在某个证书验证相关类的
静态{…}
块中处理的

如果您仍然希望在每个请求基础上启用/禁用证书吊销检查,则可以通过实现您自己使用的来实现(您可以通过
PKIXParameters.setRevocationEnabled(boolean)
启用/禁用证书吊销检查)

或者,有一种解决方案可以全局启用证书吊销检查并显式处理CertificateRevokedException:

private boolean checkOnCertificateRevocation;

@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
    try {
        getDefaultTrustManager().checkServerTrusted(certs, authType);
    } catch (CertificateException e) {
        if (checkOnCertificateRevocation) {
            if (getRootCause(e) instanceof CertificateRevokedException) {
                throw e;
            }
        }
    }
}

谢谢!正如您所想,“com.sun.net.ssl.checkRevocation”属性实际上只在初始化“sun.security.validator.PKIXValidator”中的静态字段“checktlsreetion”时处理一次因此,作为一种解决方法,我们可以始终启用此属性,并根据客户端代码中的布尔标志捕获/重试异常。但可能存在一些更优雅的解决方案来启用/禁用每个请求中的吊销检查?您可以实现自己的
X509TrustManager
,它使用
CertPathValidator
验证证书。使用的
PKIXParameters
类有一个名为
setRevocationEnabled(boolen)的方法
它可以启用/禁用证书撤销检查。这应该适用于每个请求级别。感谢您的帮助!但是,在多次尝试实现过度复杂的
CertPathValidator
之后,它决定坚持使用“总是在需要时抛出,捕获”原则。自定义
X509TrustManager
的最后一个代码现在看起来像
@Override public void checkServerTrusted(X509Certificate[]证书,字符串authType)抛出CertificateException{try{getDefaultTrustManager().checkServerTrusted(证书,authType);}catch(CertificateException e){if(checkOnCertificateCertificateReception){if(getRootCause(e)instanceof CertificateRevokedException){throw e;}}}}}}
@Roman我更新了我的答案,并从评论中包括了我们的讨论。
private boolean checkOnCertificateRevocation;

@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
    try {
        getDefaultTrustManager().checkServerTrusted(certs, authType);
    } catch (CertificateException e) {
        if (checkOnCertificateRevocation) {
            if (getRootCause(e) instanceof CertificateRevokedException) {
                throw e;
            }
        }
    }
}