gpt4 book ai didi

java - 在 Java CXF 客户端中实现双向 SSL

转载 作者:太空宇宙 更新时间:2023-11-03 14:29:36 25 4
gpt4 key购买 nike

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

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

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

"1. Client hello - The client sends the server information including the highest version of SSL it supports and a list of the cipher suites it supports. (TLS 1.0 is indicated as SSL 3.1.) The cipher suite information includes cryptographic algorithms and key sizes."

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

authentication algorithm - dictates how server authentication and (if needed) client authentication will be carried out.

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

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

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

最佳答案

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

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

设置

关于java - 在 Java CXF 客户端中实现双向 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53854686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com