WSDL客户端身份验证和多个证书
问题描述:
因此,我在这里遇到了一些与wsdls有关的问题,并在java中选择了多个证书。例如,智能卡上有多个证书,用于签名,加密和识别。我有一个生成的代码,客户端身份验证连接,但据我所知,你给的WSDL密钥库的路径通过设置属性WSDL,像这样WSDL客户端身份验证和多个证书
System.setProperty("javax.net.ssl.keyStore",
keyStore);
System.setProperty("javax.net.ssl.keyStorePassword",
keyStorePassword);
我下面这个tutorial 。 现在,对于密钥库中的多个证书(如智能卡中的证书),这会出现问题,因为无法指定要在该智能卡上使用的WHICH证书。它看起来像wsdl选择密钥库中的第一个证书,这可能是错误的证书进行身份验证。
我的问题是2倍:
有没有办法比做
System.setProperty
告诉使用哪个证书WSDL等?我能做些什么来指定哪些证书,因为大多数代码是由wsdl使用wsconsume
生成的?System.setProperty()
只允许您指定路径。有没有办法指定一个对象?我从智能卡获取证书的方式是使用SunPKCS11类(如发现here)。但是,这返回给我一个密钥库对象,并且据我所知System.setProperty()
想要一个路径。
感谢您的帮助!
答
我终于找到了我的问题的答案。请记住我正在使用CXF。
所以当我在wsdl上调用wsdl2java时,我得到了一堆生成的代码。有两个部分特别适用于授权和授权服务。在我的代码,以调用这些链接,我下面
AuthorizationService authSvc = new AuthorizationService();
Authorization authWs = authSvc.getAuthorizationPort();
在这一点上,你就必须建立从所选证书的新密钥库来构建自己的KeyManager和的TrustManager。上手的好地方是this
然后,你需要构建TLSClientParameters
TLSClientParameters params = new TLSClientParameters();
params.setKeyManagers(keyManagers);
params.setTrustManagers(trustManagers);
然后创建您的HTTPConduit。
HTTPConduit conduit = (HTTPConduit) ClientProxy.getClient(authWs).getConduit();
conduit.setTlsClientParameters(params);
然后您可以使用您的Web服务和您的用户选择的证书。