2011-11-25 146 views
5

因此,我在这里遇到了一些与wsdls有关的问题,并在java中选择了多个证书。例如,智能卡上有多个证书,用于签名,加密和识别。我有一个生成的代码,客户端身份验证连接,但据我所知,你给的WSDL密钥库的路径通过设置属性WSDL,像这样WSDL客户端身份验证和多个证书

System.setProperty("javax.net.ssl.keyStore", 
    keyStore); 
    System.setProperty("javax.net.ssl.keyStorePassword", 
    keyStorePassword); 

我下面这个tutorial 。 现在,对于密钥库中的多个证书(如智能卡中的证书),这会出现问题,因为无法指定要在该智能卡上使用的WHICH证书。它看起来像wsdl选择密钥库中的第一个证书,这可能是错误的证书进行身份验证。

我的问题是2倍:

  1. 有没有办法比做System.setProperty告诉使用哪个证书WSDL等?我能做些什么来指定哪些证书,因为大多数代码是由wsdl使用wsconsume生成的?

  2. System.setProperty()只允许您指定路径。有没有办法指定一个对象?我从智能卡获取证书的方式是使用SunPKCS11类(如发现here)。但是,这返回给我一个密钥库对象,并且据我所知System.setProperty()想要一个路径。

感谢您的帮助!

回答

1

我终于找到了我的问题的答案。请记住我正在使用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服务和您的用户选择的证书。

相关问题