Java 具有相互SSL的SOAP-如何通过凭据发送?
在需要相互SSL加密之前,上面的代码可以很好地调用我的SOAP服务 打开后,我尝试创建SSL上下文并将其设置为:Java 具有相互SSL的SOAP-如何通过凭据发送?,java,soap,jaxb,Java,Soap,Jaxb,在需要相互SSL加密之前,上面的代码可以很好地调用我的SOAP服务 打开后,我尝试创建SSL上下文并将其设置为: public class ResLookupGetService extends Service { ServerServicePortType getServerServicePort(); } public interface ServerServicePortType { ServerServiceResponse doSoapMethod(RequestObj
public class ResLookupGetService extends Service {
ServerServicePortType getServerServicePort();
}
public interface ServerServicePortType {
ServerServiceResponse doSoapMethod(RequestObject request, ParamObject parameters);
}
ServerServicePortType service = new ServerServiceGetService().getServerServicePort();
ServerServiceResponse response = service.doSoapMethod(request, parameters);
以及创建SSLContext
的代码:
ServerServicePortType service = new ServerServiceGetService().getServerServicePort();
BindingProvider bindingProvider = (BindingProvider) service;
bindingProvider.getRequestContext().put(
"com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory",
getSslContext().getSocketFactory());
ServerServiceResponse response = service.doSoapMethod(request, parameters);
但它似乎没有正确地传递我的凭证。我的设置正确吗
感谢事实证明,使用
BindingProvider
什么也做不到(或者至少我无法使用它,使其发挥作用)
在调用web服务之前,我只需设置以下系统属性:
public SSLContext getSslContext(String keyStorePath, String keyStoreType, String trustStorePath) {
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
InputStream ksis = ClassLoader.getSystemResourceAsStream(keyStorePath);
keyStore.load(ksis, "mypassword".toCharArray());
ksis.close();
KeyStore trustStore = KeyStore.getInstance("JKS");
InputStream tsis = ClassLoader.getSystemResourceAsStream(trustStorePath);
trustStore.load(tsis, "mypassword".toCharArray());
tsis.close();
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
KeyManagerFactory kmf =
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, "mypassword".toCharArray());
sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
return sslContext;
}
然后我可以像平常一样拨打服务电话:
private void setSystemProps() {
String keyStoreFileName = "ssl/clientKeyStore.jks";
String keyStorePath = ClassLoader.getSystemResource(keyStoreFileName).getPath();
String keyStoreType = "JKS";
String keyStorePassword = "mypassword";
String trustStoreFileName = "ssl/clientTruststore.jks";
String trustStorePath = ClassLoader.getSystemResource(trustStoreFileName).getPath();
String trustStoreType = "JKS";
String trustStorePassword = "mypassword";
Properties systemProps = System.getProperties();
systemProps.put("javax.net.ssl.keyStore", keyStorePath);
systemProps.put("javax.net.ssl.keyStorePassword", trustStorePassword);
systemProps.put("javax.net.ssl.keyStoreType", keyStoreType);
systemProps.put("javax.net.ssl.trustStore", trustStorePath);
systemProps.put("javax.net.ssl.trustStoreType", trustStoreType);
systemProps.put("javax.net.ssl.trustStorePassword", keyStorePassword);
System.setProperties(systemProps);
}
值得注意的是,当我设置系统属性时,它们接受任何对象
作为值,而我最初错误地将其设置为URL对象而不是字符串
因此,trustStorePath
和keystrepath
变量被设置为.getPath()
值,这是一个绝对文件路径,例如:
ServerServicePortType service = new ServerServiceGetService().getServerServicePort();
ServerServiceResponse response = service.doSoapMethod(request, parameters);
现在一切都好了
"/Users/username/path/to/directory/with/ssl/clientKeyStore.jks"