这是一个很难破解的坚果,因此记录如下:
要解决此问题,它需要一个自定义,
KeyManager并
SSLSocketFactory使用此自定义
KeyManager访问的分隔符KeyStore。我发现基码本KeyStore和SSLFactory对这个优秀的博客条目: 如何对动态选择-一个证书别名时,调用的Web服务
然后,
SSLSocketFactory需要将专门的插入到WebService上下文中:
service = getWebServicePort(getWSDLLocation());BindingProvider bindingProvider = (BindingProvider) service; bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", getCustomSocketFactory()); 当getCustomSocketFactory()返回一个SSLSocketFactory使用该方法产生如上所述。假定指示该SSLSocketFactory属性的字符串是此实现专有的,那么这仅适用于JDK中内置的Sun-Oracle impl的JAX-WS RI 。
在此阶段,通过SSL保护JAX-WS服务通信的安全,但是如果您从同一安全服务器()加载WSDL,则将遇到引导程序问题,因为将不会使用HTTPS收集WSDL的请求与Web服务相同的凭据。我通过使WSDL在本地可用(file:/// …)并动态更改Web服务端点来解决了这个问题:(可以在此论坛中找到有关为什么需要这样做的很好的讨论)
bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, webServiceLocation);
现在,WebService已启动,并可以使用命名的(别名)客户端证书和相互身份验证通过SSL与服务器副本进行通信。



