【问题标题】:Enforce Two-Way SSL in Java CXF clients在 Java CXF 客户端中实施双向 SSL
【发布时间】:2018-12-19 15:45:13
【问题描述】:

双向 SSL(或相互身份验证)通常由服务器在 HTTPS 中指定。例如,this tutorial 解释了如何设置 WildFly 应用服务器以要求 Web 服务客户端在通信期间提供证书。

但是,在我们的例子中,我们需要在客户端强制执行双向 SSL。这意味着我们的客户端配置了客户端证书,以便它可以在握手期间提供证书。如果我们要连接的服务器不要求提供证书,我们想中止通信。

SSL 握手的描述,如标题为“SSL 协议”here(稍远一点)部分中的图表,解释了发生的第一件事是如何选择密码套件:

"1. Client hello - 客户端向服务器发送的信息包括 它支持的最高版本的 SSL 和它的密码套件列表 支持。 (TLS 1.0 表示为 SSL 3.1。)密码套件 信息包括加密算法和密钥大小。”

在 Java 方面(更具体地说:在我的情况下为 CXF),filter cipher suites("cipherSuitesFilter") 是可能的 - 所以我认为可以将密码套件限制为那些需要相互验证。但我没有找到密码套件和双向 SSL 之间的任何链接。例如,this page 注释:

身份验证算法 - 规定服务器身份验证和(如果 需要)将执行客户端身份验证。

我开始认为这意味着密码套件只规定如何客户端身份验证完成,而不是如果需要客户端身份验证。

这让我陷入了死胡同。有没有其他方法可以在客户端强制执行客户端身份验证?

现在我能想到的唯一解决方案是在握手完成后找到正确的钩子方法来实现 SSL 通信,检查连接是否使用客户端身份验证,如果不是,则中止。但是,如果存在这种情况,我想使用任何常见的方法。

【问题讨论】:

    标签: java ssl cxf mutual-authentication


    【解决方案1】:

    我们没有找到比我在问题中已经提到的解决方案更好的解决方案。 作为客户端,我们只能检查是否使用客户端证书建立了连接。这并不能保证服务器彻底验证了证书,只是它请求了证书。

    我们的实现是一个自定义的javax.net.ssl.SSLSocketFactory,它扩展了createSocket 方法来检查javax.net.ssl.SSLSession.getLocalCertificates() 是否返回一些东西。如果不是,则抛出javax.net.ssl.SSLException 的异常子类以中止通信。 套接字工厂是通过org.apache.cxf.configuration.jsse.TLSClientParameters.setSSLSocketFactory(SSLSocketFactory).设置的

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 1970-01-01
      • 2017-10-04
      • 2014-01-15
      • 1970-01-01
      • 2023-04-04
      • 2015-02-07
      • 2011-03-12
      • 1970-01-01
      相关资源
      最近更新 更多