SOAP-связь через HTTPS
У меня есть небольшое приложение, написанное на Java, которое взаимодействует с сервером с использованием SOAP и через HTTPS. У меня есть jks сервера, но когда я пытаюсь добавить его в склад доверенных сертификатов и сделать запрос, я получаю сообщение об ошибке:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCe rtPathBuilderException: unable to find valid certification path to requested target
Мой код:
public WStest() {
this.testTrustStore = getClass().getClassLoader().getResourceAsStream("Keys/serverkeystore.jks");
this.testPasswd = "server-p@ssword";
}
public HttpsUrlConnectionMessageSender httpComponentsMessageSender() throws Exception {
KeyStore ts = KeyStore.getInstance("JKS");
ts.load( testTrustStore, testPasswd.toCharArray());
try {
testTrustStore.close();
} catch ( IOException ex) {}
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm()
);
trustManagerFactory.init(ts);
HttpsUrlConnectionMessageSender messageSender = new HttpsUrlConnectionMessageSender();
messageSender.setTrustManagers(trustManagerFactory.getTrustManagers());
messageSender.setHostnameVerifier((hostname, sslSession) -> {
if (hostname.equals("localhost")) {
return true;
}
return false;
});
return messageSender;
}
private WebServiceTemplate makeTemplate() throws Exception {
WebServiceTemplate localTemplate = new WebServiceTemplate();
Jaxb2Marshaller marshaller = makeMarshaller();
localTemplate.setMarshaller(marshaller);
localTemplate.setUnmarshaller(marshaller);
localTemplate.setMessageSender(httpComponentsMessageSender());
return localTemplate;
}
Я не знаю, должен ли сервер иметь мой сертификат в своем TrustStore или что еще может быть не так. Мне нужна помощь для этого, я пытался сделать это несколькими способами, это тот, который лучше всего соответствует моим потребностям, но не работает. Заранее спасибо!