OpenLiberty:如何为JAX-WS客户端设置自定义SSLContext?
基于xmlWS-4.0的SOAP客户端配置自定义SSLContext方法
可以实现自定义SSLContext的配置,但和你用restfulWSClient的方式不一样——BindingProvider本身没有直接提供sslContext()这类API,需要通过xmlWS的特定上下文属性或自定义传输管道来完成,以下是两种常用方案:
方案一:通过BindingProvider请求上下文设置SSLSocketFactory
先将自定义SSLContext转换成SSLSocketFactory,再绑定到SOAP客户端的请求上下文:
// 假设已初始化好自定义SSLContext实例customCtx SSLSocketFactory sslSocketFactory = customCtx.getSocketFactory(); // 创建SOAP服务端口并转为BindingProvider YourSoapServicePort port = new YourSoapService().getYourSoapServicePort(); BindingProvider bindingProvider = (BindingProvider) port; // 设置xmlWS专属的SSL Socket Factory属性 bindingProvider.getRequestContext().put( "com.sun.xml.ws.transport.https.client.SSLSocketFactory", sslSocketFactory );
方案二:自定义HTTP传输管道
如果需要更全局或灵活的控制,可以替换默认的HTTP传输管道:
// 自定义传输管道工厂,注入自定义SSLContext的SocketFactory HttpTransportPipeFactory pipeFactory = new HttpTransportPipeFactory() { @Override public HttpTransportPipe create(HttpTransportPipe.AssemblerContext context) { HttpTransportPipe pipe = super.create(context); pipe.setSSLSocketFactory(customCtx.getSocketFactory()); return pipe; } }; // 注册自定义管道工厂 TransportPipeFactory.set(pipeFactory); // 正常创建SOAP客户端端口即可 YourSoapServicePort port = new YourSoapService().getYourSoapServicePort();
注意事项
com.sun.xml.ws.transport.https.client.SSLSocketFactory是xmlWS的特定属性,xmlWS-4.0版本兼容该配置方式;- 若需兼容JAX-WS标准规范,也可通过自定义
URLConnection结合BindingProvider的地址属性实现,但上述两种方式更贴合xmlWS的原生用法。
内容的提问来源于stack exchange,提问作者jan
相关产品推荐
相关产品推荐

