Разрешение javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой построения пути PKIX Ошибка? - PullRequest
361 голосов
/ 08 марта 2012

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

Вот оригинальный номер.

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

подробное сообщение 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(port 8443) и App2(port 443). App1 подключается к App2. Когда App1 подключается к App2, я получаю вышеуказанную ошибку. Я знаю, что это очень распространенная ошибка, поэтому сталкивался со многими решениями на разных форумах и сайтах. У меня есть запись ниже в server.xml обоих Tomcats:

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

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

Option1

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

Option2 Установка ниже в переменной среды

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

Вариант3 Установка ниже в переменной среды

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

Но ничего не получалось .

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

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

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

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and 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());

Ответы [ 16 ]

2 голосов
/ 06 декабря 2012

Я написал небольшой сценарий Win32 (WinXP 32bit Testet) глупый cmd (командная строка), который ищет все версии Java в программных файлах и добавляет к ним сертификат.Пароль должен быть «changeit» по умолчанию или изменить его самостоятельно в скрипте: -)

@echo off

for /F  %%d in ('dir /B %ProgramFiles%\java') do (
    %ProgramFiles%\Java\%%d\bin\keytool.exe -import -noprompt -trustcacerts -file some-exported-cert-saved-as.crt -keystore %ProgramFiles%\Java\%%d\lib\security\cacerts -storepass changeit
)

pause
1 голос
/ 10 июня 2014

Чтобы Tomcat работал на сервере Ubuntu, чтобы узнать, какая Java используется, используйте команду «ps -ef | grep tomcat»:

Пример:

/home/mcp01$ **ps -ef |grep tomcat**
tomcat7  28477     1  0 10:59 ?        00:00:18 **/usr/local/java/jdk1.7.0_15/bin/java** -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.awt.headless=true -Xmx512m -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
1005     28567 28131  0 11:34 pts/1    00:00:00 grep --color=auto tomcat

Затем мыможно войти в: файл cd /usr/local/java/jdk1.7.0_15/jre/lib/security

По умолчанию cacerts файл находится здесь.Вставьте в него ненадежный сертификат.

0 голосов
/ 13 мая 2019

Для MacOS X ниже точная команда работала для меня, где я должен был попробовать с двойной Hypen в опции importcert, которая работала:

sudo keytool -–importcert -file /PathTo/YourCertFileDownloadedFromBrowserLockIcon.crt -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/security/cacerts -alias "Cert" -storepass changeit
0 голосов
/ 22 марта 2019

Я сталкиваюсь с этой проблемой, используя AndroidStudio, Charles Proxy, JUnit и Robolectric.Благодаря @SimonSez я смог решить эту проблему.

  1. %JAVA_HOME% - Android использует другой JavaHome.Вы можете найти полный путь на вкладке UnitTests resulr.В моем случае это /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home

    enter image description here

  2. Загрузить сертификат Чарльза (например, Downloads папка)

  3. Запустите команду

    sudo keytool -import -noprompt -trustcacerts -alias charles -file <path to Charles certificate.pem> -keystore "JAVA_HOME/jre/lib/security/cacerts" -storepass changeit

    Например

    sudo keytool -import -noprompt -trustcacerts -alias charles -file ~/Downloads/charles-ssl-proxying-certificate.pem -keystore "/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts" -storepass changeit

Официальный документ Чарльза

0 голосов
/ 14 января 2019

для безопасности мы не должны использовать самозаверяющие сертификаты в нашей реализации.Тем не менее, когда речь заходит о разработке, нам часто приходится использовать пробные среды с самоподписанными сертификатами.Я попытался исправить эту проблему программно в моем коде, и мне это не удалось.Однако добавление сертификата в jre trust-store решило мою проблему.Ниже приведены шаги,

  1. Загрузка сертификата сайта,

  2. Скопируйте сертификат (например: cert_file.cer) в каталог $ JAVA_HOME \ Jre \ Lib \ Security

  3. Откройте CMD в Администраторе и измените каталог на $ JAVA_HOME \ Jre \ Lib \ Security

  4. Импортируйте сертификат в хранилище доверенных сертификатов, используя следующую команду,

keytool -import -alias ca -file cert_file.cer -cacetore store -storepass changeit

Если вы получили сообщение о том, что keytool не являетсяузнайте, пожалуйста, см. это.

Тип да как показано ниже

Доверяйте этому сертификату: [Да]

Теперь попробуйте запустить свой код или получить программный доступ к URL-адресу с помощью java.

Обновить

Если ваш сервер приложений - jboss, попробуйте добавитьниже системного свойства

System.setProperty("org.jboss.security.ignoreHttpsHost","true");

Надеюсь, это поможет!

0 голосов
/ 10 февраля 2017

У меня тоже есть эта проблема.

Я попробовал почти все, добавив сертификат SSL в .keystore, но он не работал с Java1_6_x.Для меня это помогло, если бы мы начали использовать более новую версию Java, Java1_8_x в качестве JVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...