如何在JAX-WS客户端和客户端证书身份验证上指定客户端证书

时间:2016-06-17 07:52:59

标签: java web-services soap jax-ws client-certificates

我用Java编写JAX-WS客户端。使用客户端证书保护对WebService的访问。我知道客户端证书是正确的,因为只有导入客户端证书(在Firefox中)才可以在Firefox中获取WSDL。

但我编写应该使用WebService的java应用程序时遇到问题。我所做的是:

  MyOwnService svc = new MyOwnService(getServerURL(), MYOWNSERVICE_QNAME);
...
...
private URL getServerURL() throws IOException {
  URL url = new URL((String) cfg.get(ConfigData.SERVER_URL));

  HttpsURLConnection con = (HttpsURLConnection) url.openConnection();

  try {
    con.setSSLSocketFactory(getFactory(new File("/etc/pki/wildfly/client.keystore"), "123456"));
  } catch (Exception exc) {
    throw new IOException("Client certificate error!", exc);
  }

  return url;
}

private SSLSocketFactory getFactory(File pKeyFile, String pKeyPassword ) 
  throws ... {

  KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
  KeyStore keyStore = KeyStore.getInstance("PKCS12");

  InputStream keyInput = new FileInputStream(pKeyFile);
  keyStore.load(keyInput, pKeyPassword.toCharArray());
  keyInput.close();

  keyManagerFactory.init(keyStore, pKeyPassword.toCharArray());

  SSLContext context = SSLContext.getInstance("TLS");
  context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());

  return context.getSocketFactory();
}

但这并没有奏效。如果我运行这个,我会在MyOwnService构造函数

中得到以下异常
java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty.

实现支持客户端认证的JAX-WS客户端的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

忘记上面的代码。看来你唯一要做的就是将密钥库指定为环境变量,如:

-Djavax.net.ssl.keyStore=/etc/pki/wildfly/client.keystore -Djavax.net.ssl.keyStorePassword=123456

如果我这样做并指定正确的密钥库,它就可以工作。如果我指定了一个无效的密钥库文件(其中包含其他/错误的证书/密钥),它就不起作用:)。

但是如果密钥库包含更多的PrivateKeyEntry,我不确定Java如何从密钥库中获取正确的密钥/证书。指定javax.net.ssl.keyStoreAlias将无效。可能是Java尝试PrivateKeyEntry s,直到找到正确的... {/ p>

但是:唯一要做的就是将正确的密钥库指定为环境变量。