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

标签 java ssl certificate jax-ws

我正在一个分布式应用程序的服务器上工作,该应用程序具有浏览器客户端并且还参与与第 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, ...),但它们似乎最终使用了全局SSL上下文。 (配置命名空间my.xmpp.好像是分离的意思,其实不是这样的)

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

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

关于如何执行此操作的任何想法/指示?我找到的所有信息要么使用 javax.net.ssl.keyStore 方法,要么正在设置全局 SSLContext -我猜 - 最终会出现在同一个配置文件中。我得到的最接近有用的东西是这个请求我需要的功能的旧错误报告:Add support for passing an SSLContext to the JAX-WS client runtime

有什么要求吗?

最佳答案

这是一个难以破解的难题,所以记录一下:

为了解决这个问题,它需要一个自定义的 KeyManager 和一个使用这个自定义的 KeyManagerSSLSocketFactory 来访问分离的 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/22780786/

相关文章:

ios - react native ssl 固定

c# - 解析 "Certificate Policies"扩展

ios - 通过 OSX 将证书安装到 iOS 设备

java - splunk logging在软件中是什么意思?

java - 从 rich :ComponentControl in order to render rich:menuItems 传递 boolean 值时出现问题

java - 只有在 while true 循环中有 System.out.println() 时线程才能正确运行

ruby-on-rails - Ruby - 使用 SSL 连接并通过客户端证书进行身份验证 - sslv3 警报错误证书

java - 如何解决 JPMS 和 OSGi Bundle for Eclipse plugin project an Tycho 之间的冲突

ssl - 使用不起作用的 yum 重新安装 rhn-client-tools

azure - 下载 AzureML 模型引发 SSL 错误