У меня странная проблема, связанная с https/ssl
.
У меня есть файл cacerts (т.е. хранилище доверенных сертификатов), который содержит сертификат, правильно загруженный с сервера.Я также настраиваю следующие свойства:
System.setProperty("javax.net.ssl.trustStore", getTrustStoreFile());
System.setProperty("javax.net.ssl.trustStorePassword", getSSLPassword());
Это прекрасно работает, когда я подключаюсь к серверу, используя https (шаг A).Теперь проблема заключается в том, что если я поставлю следующую строку перед установкой вышеуказанных свойств , шаг A начнет выдавать исключение.
new URL(url).openConnection();
Исключение составляет:
Exception in thread "main" 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 sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
Это кажется очень странным.Просто отметьте, что исключение возникает только на шаге A, а не над кодом openConnection()
.Кажется, openConnection()
делает здесь что-то напуганное (кажется, загружает java cacerts по умолчанию и даже устанавливает системные реквизиты после того, как это, кажется, не удостоено чести).
Может кто-нибудь пролить немного света здесь, пожалуйста?
PS: я помещаю код openConnection()
для загрузки самого сертификата сервера, используя trustAll
хранилище доверенных сертификатов.Итак, мой поток:
* url.openConnection(), connection.getServerCertificates()
с пользовательским trustStore для загрузки сертификата.
* Сохранение сертификата в хранилище доверенных сертификатов.
* Установка системных свойств хранилища доверенных сертификатов.
* Использование фактического https/SSL
соединения (шагA).
Когда я запускаю этот второй раз (первый запуск помещает сертификат в склад доверенных сертификатов):
after commenting step 1 above -> runs fine
after just having url.openConnection() -> gives exception