Java SSL证书撤销检查

DoN*_*NuT 4 java ssl certificate-revocation

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

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

我的问题是:Java是否开箱即用检查CRL(如果提供证书)或者我是否需要手动实施此类检查?

为了测试,我准备了一个带有CRL集的证书,但是Java似乎没有尝试验证它(我将它放入本地Web服务器并且没有访问权限).

我只找到了com.sun.net.ssl.checkRevocation = true VM选项,但显然它不查询CRL.设置为java.security.debug = certpath的 VM调试不会生成任何输出,要么......

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

我使用Apache Mina作为客户端服务器编写了一个小型的maven风格的项目,它基于密钥/信任库和客户端/服务器的自签名证书初始化SSLContext,可以在这里以ZIP存档的形式下载:https://www.dropbox.com /s/3fqmd1v9mn2a5ve/ssltest.zip?dl=0

DoN*_*NuT 8

我想如何在SSLContext中启用CRL检查而不实现自定义验证器,如评论中所建议的那样.

它主要是通过撤销检查器正确初始化SSLContext的TrustManagers,只有几行,没有自定义检查逻辑,现在自动检查CRL以及验证路径.

这是一个片段......

KeyStore ts = KeyStore.getInstance("JKS");
FileInputStream tfis = new FileInputStream(trustStorePath);
ts.load(tfis, trustStorePass.toCharArray());

KeyManagerFactory kmf =  KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

// initialize certification path checking for the offered certificates and revocation checks against CLRs
CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");
PKIXRevocationChecker rc = (PKIXRevocationChecker)cpb.getRevocationChecker();
rc.setOptions(EnumSet.of(
    PKIXRevocationChecker.Option.PREFER_CRLS, // prefer CLR over OCSP
    PKIXRevocationChecker.Option.ONLY_END_ENTITY, 
PKIXRevocationChecker.Option.NO_FALLBACK)); // don't fall back to OCSP checking

PKIXBuilderParameters pkixParams = new PKIXBuilderParameters(ts, new X509CertSelector());
pkixParams.addCertPathChecker(rc);

tmf.init( new CertPathTrustManagerParameters(pkixParams) );
// init KeyManagerFactory
kmf.init(...)

SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers), tmf.getTrustManagers(), null);
Run Code Online (Sandbox Code Playgroud)

这基本上完成了我在我的应用程序中所需要的,检查发送给客户端的证书是否在我们的CRL中被撤销.只接受检查最终实体并允许CRL检查失败,因为它是我们所有的基础设施.

  • 好的 nvm 它会针对每个请求进行克隆,所以看起来很丑陋但线程安全 (2认同)

小智 6

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");
Run Code Online (Sandbox Code Playgroud)

CRL 失败,出现以下错误:How to check reservation status of X509Certificate chain using JAVA?