«WebServiceException: не удалось получить доступ к WSDL» и «CertificateException: сбой при создании пути PKIX» при доступе к внешнему WS - PullRequest
0 голосов
/ 17 марта 2020

Исключение выдается при доступе к внешнему SOAP веб-сервису:

javax.xml.ws.WebServiceException:

 Failed to access the WSDL at:
  https://<IP>/ws/services/Webservice?wsdl.

It failed with:

 java.security.cert.CertificateException:
  PKIX path building failed:

   sun.security.provider.certpath.SunCertPathBuilderException:
    unable to find valid certification path to requested target.

Я не могу получить доступ к этому URL-адресу, мне нужно отправить файл WAR для моего клиента, и ему нужно развернуть в другой среде, сервер приложений IBM Liberty, на котором, по его словам, уже настроены три сертификата: root, промежуточный и сам настоящий сертификат.

Настаивая на том, что что-то должно быть реорганизовано в коде, я сделал это до вызова внешней конечной точки , передав сертификат в качестве параметра certificateFile (все они находятся внутри src / main / resources):

Certificate certificate = CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream(certificateFile));

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("server", certificate);

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

if (url.contains("https")) {
    HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
    connection.setSSLSocketFactory(sslContext.getSocketFactory());
} else if (url.contains("http")) {
    new URL(url).openConnection();
}

Каковы в действительности шаги для доверия этим сертификатам и где эти шаги должны быть выполнены ( приложение, сервер, машина JVM, что угодно)?

1 Ответ

0 голосов
/ 18 марта 2020

Если это работает внутри Liberty, ему не нужно никакого специального кода. Вероятно, им нужно добавить сертификат из удаленного веб-сервиса в хранилище доверенных прав Liberty, как описано здесь: https://www.ibm.com/support/knowledgecenter/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/twlp_add_trust_cert.html

...