我用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客户端的正确方法是什么?
答案 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>
但是:唯一要做的就是将正确的密钥库指定为环境变量。