Изменить:-Пытался отформатировать вопрос и принял ответ в более презентабельном виде у меняБлог
Вот оригинальный выпуск.
Я получаю эту ошибку:
подробное сообщение 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());