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

Otr*_*tra 5 java authentication wsdl keystore

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

  System.setProperty("javax.net.ssl.keyStore",
    keyStore);
  System.setProperty("javax.net.ssl.keyStorePassword",
    keyStorePassword);
Run Code Online (Sandbox Code Playgroud)

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

我的问题是双重的:

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

  2. System.setProperty()只允许您指定的路径.有没有办法指定一个对象?我从智能卡获取证书的方式是使用SunPKCS11类(如此处所示).但是,这会返回给我一个keystore对象,据我所知System.setProperty()想要一个路径.

谢谢你的帮助!

Otr*_*tra 1

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

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

AuthorizationService authSvc = new AuthorizationService();
Authorization authWs = authSvc.getAuthorizationPort();
Run Code Online (Sandbox Code Playgroud)

此时,您需要通过从所选证书创建新的密钥库来构建您自己的 keyManager 和 trustmanager。是一个很好的起点

然后需要构造TLSClientParameters

TLSClientParameters params = new TLSClientParameters();
params.setKeyManagers(keyManagers);
params.setTrustManagers(trustManagers);
Run Code Online (Sandbox Code Playgroud)

然后创建您的 HTTPConduit。

HTTPConduit conduit = (HTTPConduit) ClientProxy.getClient(authWs).getConduit();
conduit.setTlsClientParameters(params);
Run Code Online (Sandbox Code Playgroud)

然后您可以将您的网络服务与您的用户选择的证书一起使用。