Разрешение javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: ошибка построения пути PKIX?

Изменить:-Пытался отформатировать вопрос и принял ответ в более презентабельном виде у меняБлог

Вот оригинальный выпуск.

Я получаю эту ошибку:

подробное сообщение sun.security.validator.ValidatorException: путь PKIX здание не удалось:
sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти допустимый путь сертификации к запрошенной цели

, вызвать javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: построение пути PKIX не удалось: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти действительный путь сертификации к запрошенной цели

Я использую Tomcat 6 в качестве веб-сервера. У меня есть два веб-приложения HTTPS, установленных на разных Tomcats с разными портами, но на одном компьютере. Произнесите App1 (порт 8443) и App2 (порт 443) . App1подключается к App2. Когда App1подключается к App2, я получаю указанную выше ошибку. Я знаю, что это очень распространенная ошибка, поэтому нашел много решений на разных форумах и сайтах. У меня есть следующая запись в server.xml обоих Tomcats:

keystoreFile="c:/.keystore" 
keystorePass="changeit"

Каждый сайт говорит об одной и той же причине, что сертификат, предоставленный app2, не находится в доверенном хранилище app1 jvm.Это кажется правдой также, когда я попытался перейти по тому же URL-адресу в браузере IE, он работает (с подогревом, есть проблема с сертификатом безопасности этого веб-сайта. Здесь я говорю продолжить этот веб-сайт). Но когда тот же URL-адрес попадает в Java-клиент (в моем случае), я получаю указанную выше ошибку. Поэтому, чтобы поместить его в хранилище, я попробовал следующие три варианта:

Вариант 1

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Вариант 2 Настройка ниже в переменной окружения

CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

Option3 Установка ниже в переменной окружения

JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

Но ничего не сработало.

Что, наконец, сработало, так это выполнение подхода Java, предложенного в Как обрабатывать недействительные SSL-сертификаты с помощью Apache HttpClient?Паскаля Тивента, т. е. выполнение программы InstallCert.

Но этот подход подходит для установки devbox, но я не могу использовать его в производственной среде.

Мне интересно почему три упомянутых выше подхода не работали, когда я упомянул одни и те же значения в server.xml сервера app2 и те же значения в хранилище доверенных сертификатов, установив

System.setProperty("javax .net.ssl.trustStore", "C:/.keystore") и System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

в программе app1.

Для получения дополнительной информации, вот как я устанавливаю соединение:

URL url = new URL(urlStr);

URLConnection conn = url.openConnection();

if (conn instanceof HttpsURLConnection) {

  HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();

  conn1.setHostnameVerifier(new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
      return true;
    }
  });

  reply.load(conn1.getInputStream());

392
задан Glorfindel 18 February 2019 в 09:49
поделиться