在OpenJDK 11中启用SSL证书吊销检查
Java11中是否有一些快速的“声明式”方法,而不是繁琐的手动实现,来启用证书是否被吊销的检查 我尝试使用此答案中的属性: 使用此虚拟吊销证书: 但是代码总是接受证书。我是否做错了什么,或者这些属性对于Java11不再实际?如果有的话,我们还有其他选择吗 下面是我的代码:在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("
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;
}
}
}
}