Я пытаюсь сделать подключение https с помощью встроенных функций java для этого (HttpURLConnection
). Но я получаю это исключение:Открытие пути сертификата в Java
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
...
...
Моя цепь сертификата:
Root certificate -> Intermediate certificate -> Web server certificate
Используемый сертификат является правильным по смыслу «открытия Путь». Ядром доверия является Root-сертификат, который импортируется в хранилище java в моей системе. Промежуточный сертификат не ... BUT
- Промежуточный сертификат подписан корнем, которому я доверяю, поэтому я тоже доверяю промежуточному. Сертификат
- Web-сервер подписан промежуточный сертификат, который я доверяю (точка 1)
Так проверка должна пройти успешно? У меня что-то не так?
Где-то я прочитал это:
Браузеры могут сделать автоматическое обнаружение, сервер-сервер не делает.
но отсутствие этой функциональности очень прост. Есть ли четкий способ сделать это auto-discovery?
* * Update
Да, это был вопрос, GPI. Я был в замешательстве, потому что браузеры могли проверить сертификат сервера, но java-приложение не могло. Причиной такого поведения было:
- сервер посылает только конечный сертификат, а не весь сертификат цепи;
- сертификат был недавно куплен и был подписан с относительно новым промежуточным сертификатом ;
- В браузерах имеется относительно современный список сертификатов , включая промежуточный сертификат;
- java имеет относительный не обновленный список сертификатов, а промежуточный сертификат не был внутри.
- браузеры проверяют окончательный сертификат на промежуточном этапе сертификат java не смог проверить цепочку сертификатов, потому что: 1. цепочка не была отправлена; 2. подписавший окончательный сертификат ( промежуточный) не был якорем доверия.
Решение может быть:
- сервера для возврата всей цепи сертификат системы
- промежуточного сертификата должны быть добавлены в Java хранилища доверенного
URL serverUrl = новый URL (serverAddress); соединение = (HttpURLConnection) serverUrl.openConnection(); Да, возвращенный объект HttpsURLConnection, но он наследует HttpURLConnection. – joro