Исправляем ошибку 'нет пути к цели' в Java и Glassfish
Быстрый ответ
Если вы столкнулись с ошибкой SSL-сертификата, импорт его в хранилище Java KeyStore позволит вам решить эту проблему следующим образом:
В первую очередь, вам необходимо извлечь сертификат:
echo | openssl s_client -connect ХОСТ:ПОРТ | openssl x509 > myserver.crt
Примените
ХОСТ
иПОРТ
к реальным значениям вашего сервера.Теперь вам нужно добавить сертификат в хранилище ключей:
keytool -importcert -file myserver.crt -keystore ${JAVA_HOME}/lib/security/cacerts -alias "myserver"
Пароль для доступа к хранилищу по умолчанию —
changeit
, если вы его ранее не изменяли.
Прежде чем начать праздновать, проверьте следующее:
- Возможно ли записывать в файл
cacerts
. - Совпадают ли учётные данные хранилища доверия с настройками JVM.
- Подойдёт ли место, куда вы переместили файл хранилища доверия.
- Если вы используете Glassfish, то убедитесь в правильности выбора файла cacerts.
Руководство по восстановлению порядка: Работаем с хранилищами Keystore и Trust Store
Правильная отладка SSL
Для включения отладки SSL используйте:
java -Djavax.net.debug=all -jar YourApplication.jar
Для более конкретной отладки можно использовать -Djavax.net.debug=ssl,handshake
, которая даст вам информацию о рукопожатии, и -Djavax.net.debug=ssl:record
для наблюдения за записями SSL.
Различия между Keystore и Trust Store
Keystore хранит ваши ключи и сертификаты, тогда как trust store содержит сертификаты, которым вы доверяете.
Настройка Trust Store
Настройте trust store через системные свойства JSSE:
-Djavax.net.ssl.trustStore=путь_к_truststore
-Djavax.net.ssl.trustStorePassword=пароль_truststore
Убедитесь в доступности файла хранилища доверия и в корректности пароля для JVM.
Проверяем цепочку сертификатов сервера
Убедитесь, что в хранилище доверия присутствует цепочка сертификатов сервера.
Визуализация
Путь сертификации можно представить как очередь в аэропорту:
СЕРТ1️⃣ ➡️ СЕРТ2️⃣ ➡️ СЕРТ3️⃣ ➡️ Запрошенная Цель
Ошибка сертификации схожа с отказом в доступе:
СЕРТ1️⃣ ➡️ ❌ "Ваш регистрационный проход не удался!"
После получения сертификатов в правильном порядке, вы готовы к работе:
СЕРТ1️⃣ ➡️ СЕРТ2️⃣ (обновлён) ➡️ 🎉 "Вы готовы к полёту!"
Дополнительное важное замечание: Конфигурация доверительного хранилища вне Java
Серверные приложения и библиотеки в Java могут иметь свои настройки SSL.
Особенности отладки: Рукопожатие и записи
Для более глубокой отладки используйте -Djavax.net.debug=ssl:handshake
или -Djavax.net.debug=ssl:record
.
Ресурсы Оракла
Для углубленного изучения SSL обратитесь к Руководству по безопасности Java SE.
Некоторые дополнительные моменты, которые стоит учитывать
Особенности серверного приложения
Осознавайте SSL-требования вашего серверного приложения и его конфигурацию.
Права на запись – обязательны
Если у вас возникли проблемы с импортом сертификата, проверьте права на файл хранилища.
Использование утилит
Используйте Java утилиты, например, InstallCert.java, для автоматического импорта сертификатов.
Свойства безопасности Java
Устанавливайте и управляйте системными свойствами, такими как javax.net.ssl.keyStorePassword
, и следите за их соответствующей конфигурацией.
Полезные материалы
- Руководство по архитектуре криптографии Java (JCA) — информация о Java Keystores.
- Руководство по JSSE (Java Secure Socket Extension) — руководство по использованию безопасных сокетов.
- javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException — обсуждение решения исключения.
- keytool — команды для работы с сертификатами.
- Невозможно подключиться к SSL-сервисам из-за ошибки "PKIX Path Building Failed" — наиболее вероятные причины и способы решения этой проблемы.