Java SSL证书撤销检查

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

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

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

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

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

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

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

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

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

这是一个片段……

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.SOFT_FAIL, // handshake should not fail when CRL is not available 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); 

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

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

Interesting Posts