当前位置: 首页 > 知识库问答 >
问题:

Java SSL证书撤销检查

耿招
2023-03-14

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

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

编辑:删除过时的Dropbox链接

共有1个答案

曹鹏海
2023-03-14

我想知道如何在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);

这基本上完成了我在应用程序中所需的工作,检查是否在CRL中撤销了颁发给客户机的证书。只接受检查结束实体并允许CRL检查失败,因为它是我们所有的基础结构。

 类似资料:
  • 我对PKI的世界是新的,一般的证书。我正在写一个服务,需要验证证书链。 感谢所有的指示和帮助提前。感激不尽。 致以最诚挚的问候

  • 提前谢谢你

  • 问题内容: 我目前正在使用SSL编写网络TCP服务器。在生产中,我们最终将要求客户使用证书进行身份验证。 为了在紧急情况下吊销证书,我们还想建立一个CRL。 我的问题是:Java是否开箱即用地检查CRL(如果提供了证书),还是需要手动实施此类检查? 为了进行测试,我准备了带有CRL设置的证书,但是Java似乎没有尝试对其进行验证(我将其放入本地Web服务器中并且无法访问)。 我仅找到 _com.s

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

  • 我正在尝试使用DSS框架根据X509证书的吊销状态验证它,您在哪里找到它? 我使用这段代码用CRL和OCSP验证证书。我想知道是否已被撤销。 类具有类似于、、的方法,但没有与撤销相关的方法。 我在其他论坛上找到了一个方法,但我没有。我确信我已经安装了所有的依赖项。 因此,我只需要一个简单的真/假。

  • 目前只有 刷卡支付 有此功能。 调用支付接口后请勿立即调用撤销订单API,建议支付后至少15s后再调用撤销订单接口。 通过内部订单号撤销订单 $app->reverse->byOutTradeNumber("商户系统内部的订单号(out_trade_no)"); 通过微信订单号撤销订单 $app->reverse->byTransactionId("微信的订单号(transaction_id)"