Разрешение javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: не удалось построить путь PKI ⇐ JAVA
Разрешение javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: не удалось построить путь PKI
Изменить. В своем блоге я попытался отформатировать вопрос и принять ответ более презентабельно.
Вот исходная проблема.
Я получаю эту ошибку:
подробное сообщение 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). Приложение1 подключается к Приложению2. Когда приложение 1 подключается к приложению 2, я получаю вышеуказанную ошибку. Я знаю, что это очень распространенная ошибка, поэтому на разных форумах и сайтах встречал множество решений. У меня есть запись ниже в server.xml обоих Tomcats:
keystoreFile="c:/.keystore" keystorePass="changeit" На всех сайтах указывается одна и та же причина: сертификат, предоставленный приложением 2, не находится в доверенном хранилище jvm приложения 1. Это похоже на правду, когда я пытался перейти по тому же URL-адресу в браузере IE, это работало (с потеплением, возникла проблема с сертификатом безопасности этого веб-сайта. Здесь я говорю, продолжайте работу с этим веб-сайтом). Но когда Java-клиент (в моем случае) обращается к тому же URL-адресу, я получаю вышеуказанную ошибку. Итак, чтобы поместить его в хранилище доверенных сертификатов, я попробовал следующие три варианта:
Вариант 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); Вариант 2 Настройка ниже в переменной среды
CATALINA_OPTS -- имя параметра -Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---значение параметра Вариант 3 Настройка ниже в переменной среды
JAVA_OPTS -- имя параметра -Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---значение параметра Результат Но ничего не помогло.
Что наконец сработало, так это реализация подхода 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 = новый URL(urlStr); URLConnection conn = url.openConnection(); если (подключение экземпляра HttpsURLConnection) { HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection(); conn1.setHostnameVerifier(новый HostnameVerifier() { общедоступная логическая проверка (строковое имя хоста, сеанс SSLSession) { вернуть истину; } }); ответ.load(conn1.getInputStream());
Изменить. В своем блоге я попытался отформатировать вопрос и принять ответ более презентабельно.
Вот исходная проблема.
Я получаю эту ошибку:
подробное сообщение 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). Приложение1 подключается к Приложению2. Когда приложение 1 подключается к приложению 2, я получаю вышеуказанную ошибку. Я знаю, что это очень распространенная ошибка, поэтому на разных форумах и сайтах встречал множество решений. У меня есть запись ниже в server.xml обоих Tomcats:
keystoreFile="c:/.keystore" keystorePass="changeit" На всех сайтах указывается одна и та же причина: сертификат, предоставленный приложением 2, не находится в доверенном хранилище jvm приложения 1. Это похоже на правду, когда я пытался перейти по тому же URL-адресу в браузере IE, это работало (с потеплением, возникла проблема с сертификатом безопасности этого веб-сайта. Здесь я говорю, продолжайте работу с этим веб-сайтом). Но когда Java-клиент (в моем случае) обращается к тому же URL-адресу, я получаю вышеуказанную ошибку. Итак, чтобы поместить его в хранилище доверенных сертификатов, я попробовал следующие три варианта:
Вариант 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); Вариант 2 Настройка ниже в переменной среды
CATALINA_OPTS -- имя параметра -Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---значение параметра Вариант 3 Настройка ниже в переменной среды
JAVA_OPTS -- имя параметра -Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---значение параметра Результат Но ничего не помогло.
Что наконец сработало, так это реализация подхода 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 = новый URL(urlStr); URLConnection conn = url.openConnection(); если (подключение экземпляра HttpsURLConnection) { HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection(); conn1.setHostnameVerifier(новый HostnameVerifier() { общедоступная логическая проверка (строковое имя хоста, сеанс SSLSession) { вернуть истину; } }); ответ.load(conn1.getInputStream());
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение