У меня есть клиент Java, пытающийся получить доступ к серверу с самозаверяющим сертификатом.
Когда я пытаюсь отправить сообщение на сервер, я получаю следующую ошибку:
невозможно найти действительный путь сертификации для запрошенной цели
Проведя некоторое исследование по этому вопросу, я сделал следующее.
- Сохранено доменное имя моего сервера в виде
root.cer
файла. - В JRE моего сервера Glassfish я запустил это:
keytool -import -alias example -keystore cacerts -file root.cer
- Чтобы проверить, что сертификат был успешно добавлен в мой cacert, я сделал это:
keytool -list -v -keystore cacerts
я вижу, что сертификат присутствует. - Затем я перезапустил Glassfish и удалил «пост».
Я все еще получаю ту же ошибку.
У меня есть ощущение, что это потому, что мой Glassfish на самом деле не читает файл cacert, который я исправил, но, возможно, какой-то другой.
Кто-нибудь из вас имел эту проблему и может подтолкнуть меня в правильном направлении?
Ответы:
К сожалению - это может быть много вещей - и многие серверы приложений и другие java-«обёртки» склонны играть со свойствами и своими «собственными» взглядами на цепочки для ключей, а что нет. Так что это может быть что-то совершенно другое.
Если не считать связки - я бы попробовал:
чтобы увидеть, поможет ли это. Вместо «все» можно также установить «ssl», менеджер ключей и менеджер доверия - что может помочь в вашем случае. При установке значения 'help' на большинстве платформ будет отображаться что-то вроде ниже.
Независимо от этого - убедитесь, что вы полностью понимаете разницу между хранилищем ключей (в котором у вас есть личный ключ и сертификат, с которым вы подтверждаете свою личность) и хранилищем доверенных сертификатов (которое определяет, кому вы доверяете) - и тем фактом, что ваша личность также имеет «цепочку» доверия к корню - которая отделена от любой цепочки к корню, вам нужно выяснить «кому» вы доверяете.
Источник: # См. Http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug
источник
Вот решение, перейдите по ссылке ниже шаг за шагом:
http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/
JAVA FILE: чего нет в блоге
источник
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0];}
Вам необходимо настроить свойства системы JSSE, в частности указать хранилище сертификатов клиента.
Через командную строку:
или через код Java:
Для получения дополнительной информации обратитесь к подробностям на сайте RedHat .
источник
(перепост из моего другого ответа )
Используйте утилиту cli keytool из дистрибутива программного обеспечения java для импорта (и доверия! ) необходимых сертификатов
Образец:
От изменения курса dir до jre \ bin
Проверьте хранилище ключей (файл находится в каталоге jre \ bin)
keytool -list -keystore .. \ lib \ security \ cacerts
Пароль изменен
Скачайте и сохраните все сертификаты в цепочке с нужного сервера.
Добавьте сертификаты (прежде чем нужно удалить атрибут "только для чтения" в файле ".. \ lib \ security \ cacerts"), выполните: keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore .. \ lib \ security \ cacerts -file "r: \ root.crt»
случайно нашел такой простой совет. Другие решения требуют использования InstallCert.Java и JDK
источник: http://www.java-samples.com/showtutorial.php?tutorialid=210
источник
У меня была такая же проблема с SBT .
Он попытался извлечь зависимости из repo1.maven.org через ssl,
но сказал, что «не может найти действительный путь сертификации для запрошенного целевого URL».
поэтому я следил за этим постом и все еще не смог проверить соединение.
Поэтому я прочитал об этом и обнаружил, что корневого сертификата недостаточно, как это было предложено в посте, поэтому
для меня сработал импорт промежуточных сертификатов CA в хранилище ключей .
Я фактически добавил все сертификаты в цепочку, и это сработало как шарм.
источник
Решение при переходе с JDK 8 на JDK 10
certs
JDK 10
JDK 8
Шаги, чтобы исправить
jlink
как/opt/jdk/bin/jlink \ --module-path /opt/jdk/jmods...
Итак, вот разные пути и последовательность команд ...
источник
Я работаю над учебным пособием для веб-служб REST по адресу www.udemy.com (веб-службы REST Java). В примере из учебника сказано, что для того, чтобы иметь SSL, в моем проекте клиента «eclipse» должен быть каталог «trust_store», который должен содержать файл «хранилища ключей» (у нас был проект «клиента» для вызова службы и «сервисный» проект, который содержал веб-сервис REST - 2 проекта в одной рабочей области Eclipse, один клиент, другой сервис). Для простоты они сказали скопировать «keystore.jks» с сервера приложений glassfish (glassfish \ domains \ domain1 \ config \ keystore.jks), который мы используем, и поместили его в эту папку «trust_store», которую они мне внесли в клиентский проект. Кажется, это имеет смысл: самоподписанные сертификаты на сервере s key_store будет соответствовать сертификатам в клиенте trust_store. Теперь, делая это, я получаю сообщение об ошибке, о котором говорится в оригинальном сообщении. Я прогуглил это и прочитал, что ошибка происходит из-за файла «keystore.jks» на клиенте, не содержащего доверенного / подписанного сертификата, что сертификат, который он находит, является самоподписанным.
Для ясности позвольте мне сказать, что, насколько я понимаю, «keystore.jks» содержит самозаверяющие сертификаты, а файл «cacerts.jks» содержит сертификаты CA (подписанные CA). «Keystore.jks» - это «keystore», а «cacerts.jks» - «хранилище доверенных сертификатов». Как сказал выше комментатор "Bruno", "keystore.jks" является локальным, а "cacerts.jks" - для удаленных клиентов.
Итак, я сказал себе: эй, у glassfish также есть файл "cacerts.jks", который является файлом trust_store glassfish. Предполагается, что cacerts.jsk содержит сертификаты CA. И, очевидно, мне нужно, чтобы в моей папке trust_store содержался файл хранилища ключей, в котором есть хотя бы один сертификат CA. Поэтому я попытался поместить файл «cacerts.jks» в созданную мной папку «trust_store» в своем клиентском проекте и изменить свойства виртуальной машины так, чтобы они указывали на «cacerts.jks» вместо «keystore.jks». Это избавило от ошибки. Я предполагаю, что все, что нужно, это сертификат CA для работы.
Это не может быть идеальным для производства, или даже для развития, за исключением просто заставить что-то работать. Например, вы можете использовать команду «keytool» для добавления сертификатов CA в файл «keystore.jks» на клиенте. Но в любом случае, надеюсь, это, по крайней мере, сужает возможные сценарии, которые могут происходить здесь, чтобы вызвать ошибку.
ТАКЖЕ: мой подход оказался полезным для клиента (сертификат сервера добавлен в клиент trust_store), похоже, что приведенные выше комментарии для разрешения исходного сообщения полезны для сервера (сертификат клиента добавлен в сервер trust_store). Приветствия.
Настройка проекта Eclipse:
--- cacerts.jks --- keystore.jks
Фрагмент из файла MyClientProject.java:
источник
Моя проблема заключалась в том, что на моем рабочем ноутбуке было установлено ПО Cloud Access Security Broker NetSkope с помощью обновления программного обеспечения. Это изменяло цепочку сертификатов, и я все еще не мог подключиться к серверу через мой клиент Java после импорта всей цепочки в мое хранилище ключей cacerts. Я отключил NetSkope и смог успешно подключиться.
источник
В моем случае я столкнулся с проблемой, потому что в моем процессе tomcat хранилище ключей было задано с использованием
Когда я импортировал сертификат в cacert JRE / lib / security, изменения не отражались. Затем я сделал ниже команду, где /tmp/cert1.test содержит сертификат целевого сервера
Мы можем дважды проверить успешность импорта сертификата
и посмотрите, найден ли ваш taget-сервер против псевдоним rapidssl-myserver
источник
Проверьте, существует ли файл
$JAVA_HOME/lib/security/cacerts
! В моем случае это был не файл, а ссылка на/etc/ssl/certs/java/cacerts
а также ссылка на себя (ЧТО ???), поэтому JVM не может найти файл.Решение: Скопируйте файл реальных cacerts ( вы можете сделать это из другого JDK ) в
/etc/ssl/certs/java/
каталог, и он решит вашу проблему :)источник
rm -f /opt/jdk-minimal/jre/lib/security/cacerts ; ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts
Допустим, вы используете переменные classpath, такие как $ {JAVA_HOME} в pom.xml.
В целях добавьте переменные classpath. то есть .., -DANT_HOME, -DJAVA_HOME
источник