gpt4 book ai didi

java - 如何以编程方式设置 JAX-WS 客户端的 SSLContext?

转载 作者:IT老高 更新时间:2023-10-28 20:27:57 25 4
gpt4 key购买 nike

我正在一个分布式应用程序中的服务器上工作,该应用程序具有浏览器客户端,并且还参与与第 3 方的服务器到服务器通信。我的服务器有一个 CA 签名证书,让我的客户端使用 HTTP/S 和 XMPP(安全)使用 TLS (SSL) 通信进行连接。一切正常。

现在我需要通过 HTTPS/SSL 使用 JAX-WS 安全地连接到第 3 方服务器。在此通信中,我的服务器在 JAX-WS 交互中充当客户端,并且我有一个由第 3 方签署的客户端证书。

我尝试通过标准系统配置 (-Djavax.net.ssl.keyStore=xyz) 添加新的 keystore ,但我的其他组件显然受此影响。尽管我的其他组件对其 SSL 配置使用专用参数(my.xmpp.keystore=xxx, my.xmpp.truststore=xxy, ...),但似乎它们最终使用了全局SSLContext。 (配置命名空间my.xmpp.好像是表示分离,其实不然)

我还尝试将我的客户端证书添加到我的原始 keystore 中,但 - 再次 - 我的其他组件似乎也不喜欢它。

我认为我剩下的唯一选择是以编程方式 Hook 到 JAX-WS HTTPS 配置,以便为客户端 JAX-WS 交互设置 keystore 和信任库。

关于如何做到这一点的任何想法/指针?我找到的所有信息要么使用 javax.net.ssl.keyStore 方法,要么设置全局 SSLContext -我猜 - 最终会出现在同一个 confilc 中。我最接近有用的是这个旧的错误报告,它要求我需要的功能:Add support for passing an SSLContext to the JAX-WS client runtime

有什么需要吗?

最佳答案

这是一个难以破解的难题,因此记录在案:

为了解决这个问题,它需要一个自定义 KeyManager 和一个 SSLSocketFactory 使用这个自定义 KeyManager 来访问分离的 KeyStore。我在这个优秀的博客条目中找到了这个 KeyStoreSSLFactory 的基本代码: how-to-dynamically-select-a-certificate-alias-when-invoking-web-services

然后,需要将专门的 SSLSocketFactory 插入到 WebService 上下文中:

service = getWebServicePort(getWSDLLocation());
BindingProvider bindingProvider = (BindingProvider) service;
bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", getCustomSocketFactory());

getCustomSocketFactory() 返回使用上述方法创建的 SSLSocketFactory。这仅适用于 JDK 中内置的 Sun-Oracle impl 中的 JAX-WS RI,因为指示 SSLSocketFactory 属性的字符串对于此实现来说是专有的。

在这个阶段,JAX-WS 服务通信是通过 SSL 保护的,但是如果您从同一个安全服务器 () 加载 WSDL,那么您将遇到引导问题,因为收集 WSDL 的 HTTPS 请求将不使用与 Web 服务相同的凭据。我通过使 WSDL 在本地可用 (file:///...) 并动态更改 Web 服务端点来解决这个问题:(关于为什么需要这样做的很好的讨论可以找到 in this forum)

bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, webServiceLocation); 

现在 WebService 得到引导,并且能够使用命名(别名)客户端证书和相互身份验证通过 SSL 与服务器对应方通信。 ∎

关于java - 如何以编程方式设置 JAX-WS 客户端的 SSLContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11001102/

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