当前位置: 首页 > 面试题库 >

Java SSL证书吊销检查

唐哲
2023-03-14
问题内容

我目前正在使用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

问题答案:

我想出了如何在SSLContext中启用CRL检查,而无需实现注释中建议的自定义验证器。

主要是关于使用吊销检查器,只有几行,没有自定义检查逻辑以及现在自动检查CRL和验证路径来正确初始化SSLContext的TrustManager。

这是一个片段…

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);

从本质上讲,这满足了我在应用程序中所需的工作,检查了颁发给客户的证书是否在我们的CRL中被吊销。只接受最终实体并允许CRL检查失败,因为它是我们的所有基础结构。



 类似资料:
  • 提前谢谢你

  • 我试图使用Github桌面和git shell从Github进行克隆,但不断出现以下错误: 拉取现有存储库时也会出现同样的问题。 我已经尝试上载在

  • 如果这种理解是正确的,那么我希望x509Chain对象能够通过吊销检查,即使检查是在上面文件的2014年3/1/之后的最新吊销列表存在的情况下进行的。不幸的是,结果是验证失败,因为它认为证书已被吊销。 在这种情况下,我是否必须做进一步的测试以查看撤销日期并覆盖结果并忽略它?我是不是做了什么蠢事?我是不是误会了撤销?

  • 问题内容: 我在各地搜索过Google,并在其他社区中询问过,并且继续前进到讨论该规范的Oracle文档。但是,该文档更多地涵盖了方法的命名以及整个体系结构,实际上并未提出讨论如何实际编写一些代码来检查x509证书是否被撤销的方法。 也许这只是我头上的办法?但是如果有人可以帮助我,我肯定会感激不尽,我已经将头撞在墙上的墙上已经有大约一周的时间了。 问题答案: 每个CA都会发布已撤销的证书列表。此列

  • 我目前正在使用SSL编写一个网络TCP服务器。在生产中,我们最终将要求客户机使用证书进行身份验证。 为了在紧急情况下撤销证书,我们还希望建立CRL。 编辑:删除过时的Dropbox链接

  • 我正在尝试为部署在Kubernetes集群中的应用程序启用基于TLS的相互身份验证。 希望将对应用程序的访问限制为只有那些具有受信任客户端证书的用户。 基于某些情况/条件,我还希望吊销特定用户的证书,以便该用户不再能够使用其证书访问应用程序。 我尝试在kuberentes ingress controller(基于nginx)中设置Mutual TLS,方法是添加以下注释。 是包含用于颁发客户端证