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

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


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


我尝试通过标准系统配置(-Djavax.net.ssl.keyStore=xyz)添加新的密钥库,但是其他组件显然受此影响。尽管我的其他组件正在对其SSL配置(my.xmpp.keystore=xxx, my.xmpp.truststore=xxy, ...)使用专用参数,但看来它们最终还是使用global SSLContext。(配置名称空间my.xmpp.似乎指示分离,但事实并非如此)


我还尝试将客户证书添加到原始密钥库中,但是-同样,我的其他组件似乎也不喜欢它。


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


关于如何执行此操作的任何想法/指标?我发现的所有信息都使用该javax.net.ssl.keyStore方法或设置了SSLContext-我猜想-将以同一配置结尾的全局信息。我得到的最有用的帮助是这个旧的错误报告,该报告要求我需要的功能:添加对将SSLContext传递到JAX-WS客户端运行时的支持


有需要吗?


PIPIONE
浏览 622回答 3
3回答

RISEBY

这是我根据这篇文章进行一些细微调整后解决的方法。此解决方案不需要创建任何其他类。SSLContext sc = SSLContext.getInstance("SSLv3");KeyManagerFactory kmf =    KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm() );KeyStore ks = KeyStore.getInstance( KeyStore.getDefaultType() );ks.load(new FileInputStream( certPath ), certPasswd.toCharArray() );kmf.init( ks, certPasswd.toCharArray() );sc.init( kmf.getKeyManagers(), null, null );((BindingProvider) webservicePort).getRequestContext()    .put(        "com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory",        sc.getSocketFactory() );
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java