Редактировать: - Попытался отформатировать вопрос и принял ответ более презентабельным способом в моем блоге
Вот оригинальная проблема.
Я получаю эту ошибку:
подробное сообщение 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-адрес (в моем случае), я получаю вышеуказанную ошибку. Поэтому, чтобы положить его в доверенное хранилище, я попробовал эти три варианта:
Опция 1
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
Option3 Настройка ниже в переменной среды
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Но ничего не сработало .
Наконец, сработало выполнение подхода Java, предложенного в разделе Как обрабатывать недействительные сертификаты SSL с помощью Apache HttpClient? по Паскалю 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());
domainname
свои серверы RHEL, проблема исчезла. Надеюсь, это кому-нибудь поможет.Ответы:
Вам необходимо добавить сертификат для App2 в файл хранилища доверенных сертификатов используемой JVM, расположенный по адресу
%JAVA_HOME%\lib\security\cacerts
.Сначала вы можете проверить, находится ли ваш сертификат в хранилище доверенных сертификатов, выполнив следующую команду:
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"
(вам не нужно указывать пароль)Если ваш сертификат отсутствует, вы можете получить его, загрузив его с помощью браузера и добавив его в склад доверенных сертификатов с помощью следующей команды:
keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>
После импорта вы можете снова запустить первую команду, чтобы проверить, был ли добавлен ваш сертификат.
Информацию о Sun / Oracle можно найти здесь .
источник
keytool error: java.io.FileNotFoundException ... (Access is denied)
при попытке импортировать сертификат.• Когда я получил сообщение об ошибке, я попытался выяснить значение выражения в Google и обнаружил, что эта проблема возникает, когда сервер меняет свой сертификат HTTPS SSL, а наша старая версия Java не распознает корневой центр сертификации (ЦС). ,
• Если вы можете получить доступ к URL-адресу HTTPS в своем браузере, то можно обновить Java для распознавания корневого ЦС.
• В браузере перейдите по URL-адресу HTTPS, к которому у Java нет доступа. Нажмите на цепочку сертификатов HTTPS (в Internet Explorer есть значок блокировки), нажмите на замок, чтобы просмотреть сертификат.
• Перейдите в «Детали» сертификата и «Копировать в файл». Скопируйте его в формате Base64 (.cer) . Он будет сохранен на вашем рабочем столе.
• Установите сертификат, игнорируя все предупреждения.
• Так я собрал информацию о сертификате URL-адреса, к которому я пытался получить доступ.
Теперь я должен был сделать свою версию Java известной о сертификате, чтобы в дальнейшем он не отказывался распознавать URL. В связи с этим я должен упомянуть, что, по-моему, информация о корневом сертификате по умолчанию остается в папке JDK \ jre \ lib \ security , а пароль по умолчанию для доступа: changeit.
Для просмотра информации о каскадах необходимо выполнить следующие процедуры:
• Нажмите кнопку Пуск -> Выполнить
• Введите cmd. Откроется командная строка (может потребоваться открыть ее как администратор).
• Перейдите в свой
Java/jreX/bin
каталог• Введите следующее
Это дает список текущих сертификатов, содержащихся в хранилище ключей. Это выглядит примерно так:
• Теперь я должен был включить ранее установленный сертификат в cacerts.
• Для этого используется следующая процедура:
Если вы используете Java 7:
• Затем он добавит информацию о сертификате в файл cacert.
Это решение, которое я нашел для исключения, упомянутого выше!
источник
Как работает-это в Tomcat 7
Я хотел поддержать самозаверяющий сертификат в приложении Tomcat, но следующий фрагмент не работал
вот что решило мою проблему:
1) Скачать
.crt
файл<your domain>
на свой домен (напримерjossef.com
)2) Примените
.crt
файл вcacerts
хранилище сертификатов Java<your domain>
на свой домен (напримерjossef.com
)<JAVA HOME>
на ваш домашний каталог Java3) Взломать это
Хотя iv'e установил мой сертификат в хранилище сертификатов по
Java
умолчанию, Tomcat игнорирует это (похоже, он не настроен на использование хранилищ сертификатов по умолчанию в Java).Чтобы взломать это, добавьте в ваш код следующее:
источник
В моем случае проблема заключалась в том, что веб-сервер отправлял только сертификат и промежуточный ЦС, а не корневой ЦС. Добавление этой опции JVM решило проблему:
-Dcom.sun.security.enableAIAcaIssuers=true
Источник
источник
Еще одной причиной может быть устаревшая версия JDK. Я использовал jdk версии 1.8.0_60, просто обновление до последней версии решило проблему с сертификатом.
источник
Мой файл cacerts был полностью пуст. Я решил эту проблему, скопировав файл cacerts с моего компьютера с Windows (который использует Oracle Java 7) и скопировал его на мою Linux-коробку (OpenJDK).
а затем на машине Linux
Пока все отлично работает.
источник
Для меня эта ошибка также возникла при попытке подключиться к процессу за обратным прокси-сервером NGINX, который обрабатывал SSL.
Оказалось, что проблема заключалась в сертификате без объединения всей цепочки сертификатов. Когда я добавил промежуточные сертификаты, проблема была решена.
Надеюсь это поможет.
источник
Используя Tomcat 7 под Linux, это помогло.
Под Linux
$JAVA_HOME
не всегда настраивается, но обычно/etc/alternatives/jre
указывает на$JAVA_HOME/jre
источник
Ниже код работает для меня:
источник
Я использовал,
jdk1.8.0_171
когда столкнулся с той же проблемой. Я попробовал два лучших решения здесь (добавление сертификата с помощью keytool и другого решения, в котором есть хак), но они не сработали для меня.Я обновил свой JDK до,
1.8.0_181
и он работал как шарм.источник
Я написал небольшой сценарий Win32 (WinXP 32bit Testet) глупый cmd (командной строки), который ищет все версии Java в программных файлах и добавляет к ним сертификат. Пароль должен быть «changeit» по умолчанию или изменить его самостоятельно в скрипте :-)
источник
Для MacOS X ниже точная команда работала для меня, где я должен был попробовать с двойным hypen в опции importcert, которая работала:
источник
Для меня не сработало признанное решение из этого поста: https://stackoverflow.com/a/9619478/4507034 .
Вместо этого мне удалось решить проблему, импортировав сертификацию в сертификацию моей машины.
шаги:
https://localhost:8443/yourpath
), где сертификация не работает.Manage computer certificates
Trusted Root Certification Authorities
->Certificates
your_certification_name.cer
файл.источник
Чтобы Tomcat работал на сервере Ubuntu, чтобы узнать, какая Java используется, используйте команду «ps -ef | grep tomcat»:
Образец:
Затем мы можем перейти по адресу : cd /usr/local/java/jdk1.7.0_15/jre/lib/security
Файл cacerts по умолчанию находится здесь. Вставьте в него ненадежный сертификат.
источник
для безопасности мы не должны использовать самозаверяющие сертификаты в нашей реализации. Тем не менее, когда речь заходит о разработке, нам часто приходится использовать пробные среды с самоподписанными сертификатами. Я попытался исправить эту проблему программно в моем коде, и мне это не удалось. Однако добавление сертификата в jre trust-store решило мою проблему. Пожалуйста, найдите ниже шаги,
Скачать сайт сертификата,
Скопируйте сертификат (например, cert_file.cer) в каталог $ JAVA_HOME \ Jre \ Lib \ Security
Откройте CMD в Администраторе и измените каталог на $ JAVA_HOME \ Jre \ Lib \ Security
Импортируйте сертификат в доверенное хранилище, используя следующую команду:
Если вы получили сообщение о том, что keytool не распознается, обратитесь к этому.
Тип да как ниже
Обновить
Если ваш сервер приложений jboss, попробуйте добавить системное свойство ниже
Надеюсь это поможет!
источник
ДЕПОЛОГИЧЕСКОЕ РЕШЕНИЕ (Alpine Linux)
Чтобы исправить эту проблему в наших прикладных средах, мы подготовили команды терминала Linux следующим образом:
Сгенерирует файл сертификата в домашнем каталоге.
Эта команда устанавливает openssl в Alpine Linux. Вы можете найти подходящие команды для других дистрибутивов Linux.
Сгенерировал нужный файл сертификата.
Применяет сгенерированный файл к JRE с помощью программы 'keytool'.
Примечание: пожалуйста, замените ваш DNS на
<host-dns-ssl-belongs>
Примечание 2: пожалуйста, обратите внимание, что
-noprompt
не будет запрашивать подтверждение (да / нет) и-storepass changeit
параметр отключит запрос пароля и предоставит необходимый пароль (по умолчанию «changeit»). Эти два свойства позволят вам использовать эти сценарии в ваших прикладных средах, таких как создание образа Docker.Примечание3 Если вы развертываете свое приложение через Docker, вы можете сгенерировать секретный файл один раз и поместить его в файлы проекта приложения. Вам не нужно будет генерировать это снова и снова.
источник
У меня тоже есть эта проблема.
Я попробовал почти все, добавив сертификат SSL в .keystore, но он не работал с Java1_6_x. Для меня это помогло, если бы мы начали использовать более новую версию Java, Java1_8_x в качестве JVM.
источник
У меня была эта проблема с Android Studio, когда я за прокси. Я использовал Crashlytics, который пытается загрузить файл сопоставления во время сборки.
Я добавил недостающий сертификат прокси в склад доверенных сертификатов, расположенный по адресу
/Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts
с помощью следующей команды:
keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]
например, с паролем хранилища доверенных сертификатов по умолчанию
keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt
источник
Просто небольшой взлом. Обновите URL-адрес в файле "hudson.model.UpdateCenter.xml" с https на http
источник
Я хочу присоединиться, так как у меня есть среда QEMU, где я должен загружать файлы в Java. Оказывается,
/etc/ssl/certs/java/cacerts
в QEMU действительно есть проблема, потому что она не соответствует/etc/ssl/certs/java/cacerts
среде хоста. Хост-среда находится за прокси-сервером компании, поэтому java cacerts является настроенной версией.Если вы используете среду QEMU, убедитесь, что хост-система может сначала получить доступ к файлам. Например, вы можете сначала попробовать этот скрипт на вашем хост-компьютере, чтобы увидеть. Если скрипт отлично работает на хост-машине, но не в QEMU, то у вас та же проблема, что и у меня.
Чтобы решить эту проблему, мне пришлось сделать резервную копию исходного файла в QEMU, скопировать файл в среде хоста в изолированную тюрьму QEMU, а затем java мог нормально загружать файлы в QEMU.
Лучшим решением было бы монтировать
/etc
в среду QEMU; однако я не уверен, будут ли затронуты другие файлы в этом процессе. Поэтому я решил использовать этот уродливый, но легкий обходной путь.источник
Это кажется хорошим местом для документирования другой возможной причины печально известного сообщения об ошибке PKIX. Потратив слишком много времени на просмотр содержимого хранилища ключей и доверенных сертификатов и различных конфигураций установки Java, я понял, что моя проблема сводится к ... опечатке.
Опечатка означала, что я также использовал хранилище ключей в качестве хранилища доверенных сертификатов. Поскольку мои компании Root CA не был определен как отдельный сертификат в хранилище ключей, а только как часть цепочки сертификатов, и не был определен где-либо еще (например, cacerts), я продолжал получать ошибку PKIX.
После неудачного релиза (это prod config, все было хорошо в другом месте) и двух дней царапин на голове, я наконец увидел опечатку, и теперь все хорошо.
Надеюсь, это кому-нибудь поможет.
источник
добавьте это в свой код:
источник