在Java CXF客户端中实施双向SSL

问题描述 投票:0回答:1

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

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

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

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

在Java方面(更具体地说:在我的情况下是CXF),可以使用filter cipher suites(“cipherSuitesFilter”) - 所以我认为可以将密码套件限制为需要相互认证的密码套件。但我找不到密码套件和双向SSL之间的任何链接。例如,this page指出:

身份验证算法 - 指示如何执行服务器身份验证和(如果需要)客户端身份验证。

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

这让我走到了尽头。有没有其他方法可以在客户端强制执行客户端身份验证?

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

java ssl cxf mutual-authentication
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.