WSDL客户端身份验证和多个证书

时间:2011-11-25 22:12:17

标签: java authentication wsdl keystore

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

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

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

我的问题是双重的:

  1. 除了执行System.setProperty以告诉wsdl使用哪个证书之外,还有其他方法吗?我可以做些什么来指定哪个证书,因为大多数代码是由wsdl使用wsconsume生成的?

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

  3. 感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我终于找到了问题的答案。请记住我正在使用CXF。

所以当我在wsdl上调用wsdl2java时,我得到了一堆生成的代码。特别是有两个部分处理名为Authorization和AuthorizationService的授权。在我的代码中,为了调用这些链接,我执行以下操作

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服务与您的用户选择的证书一起使用。