我有一个tomcat应用程序,它调用启用了IIS托管的ssl,启用了客户端身份验证的Web服务
这个Tomcat应用程序与多个wenservices对话,可能每个都需要客户端身份验证以及PKI身份验证。
对于IIS Web服务,wsdl url可以更改,因此我使用
javax.xml.ws.Service(url,qname)构造函数,传递wsdl的url ...
问题是我需要使用自定义客户端密钥调用上面的SSL。如何告诉上面的构造函数使用我用自定义KeyManager创建的sslsocket?我不想用 HttpsURLConnection.setDefaultSSLSocketFactory将强制执行其他传出的ssl连接以跟随我的密钥管理器,该密钥管理器是IIS Web服务独有的。 感谢您的回复。
答案 0 :(得分:2)
如果您按照your similar question on ServerFault的答案并确保Tomcat的<Connectors />
不使用javax.net.ssl
属性,则为默认密钥管理器设置密钥库可能不是结束世界。 HttpsURLConnection
只会通过它向要求它的服务器进行身份验证(服务器始终请求客户端证书身份验证),并且要求CA列表中的客户端证书与证书的颁发者匹配。这在实践中可能不是一个大问题。
如果你认为这个问题太大,似乎有undocumented property名为com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory
。其文件如下:
在BindingProvider.getRequestContext()上设置此属性以启用 HttpsURLConnection.setSSLSocketFactory(SSLSocketFactory的)。该物业 设置如下:
SSLSocketFactory sslFactory = ...;映射ctxt = ((BindingProvider)代理).getRequestContext(); ctxt.put(SSL_SOCKET_FACTORY,sslFactory);
此属性是实验性的,如有更改,恕不另行通知 在未来。