如何以编程方式设置Axis客户端的SSL上下文?

时间:2015-06-14 09:48:36

标签: java ssl soap axis

在一个非常古老的项目中,我们使用用Axis 1.4开发的客户端来调用SOAP Web服务。此Web服务使用相互身份验证机制,因此我们在密钥库中安装了专用证书,并在信任库中安装了公钥。

SOAP客户端用于BPM流程的任务中。我们不能,我们也不想使用JVM全局信任库和密钥库。然后我们无法以编程方式配置JVM全局信任和密钥库:

// Keystore
System.setProperty("javax.net.ssl.keyStore", fileKeystore);
System.setProperty("javax.net.ssl.keyStorePassword", pwdKeystore);
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
// Truststore
System.setProperty("javax.net.ssl.trustStore", fileTruststore);
System.setProperty("javax.net.ssl.trustStorePassword", pwdTruststore);
System.setProperty("javax.net.ssl.trustStoreType", "JKS");

这样的方法将迫使我们在JVM属性上同步进程,而我们并不想这样做。此外,还有其他java进程在计算机上运行。

我的问题是:Axis 1.4是否提供了一些API来指定用于特定Web服务调用的密钥库和信任库?

1 个答案:

答案 0 :(得分:4)

好的,谷歌搜索了一下我找到了问题的答案。答案是仅使用Axis 1.4无法为每个服务调用指定不同的密钥库/信任库。我们需要一个名为axistools的外部库。

库实现了一种特殊的EngineConfiguration,允许您为每个服务调用指定密钥库和/或信任库。

以下示例将是解释性的:

// Setting up the configuration
SSLClientAxisEngineConfig config = new SSLClientAxisEngineConfig();
config.setKeystore("path/to/your/keystore");
config.setKeystoreType("JKS");
config.setKeystorePassword("password");
config.setTruststore("path/to/your/truststore");
config.setTruststoreType("JKS");
config.setTruststorePassword("password");
// Very important: without this method invocation 
// the client won't work at all
config.initialize();

// Calling the web service
URL url = new URL("https://localhost:8443/someService");
WebServiceLocator locator = new WebServiceLocator (config);
WebServiceSoap port = locator.getWebServiceSoap(url);
WebServiceSoapStub stub = (WebServiceSoapStub) port;
stub.serviceMethod();

就是这样,伙计们!