Ошибка простой проверки обновлений с SSLHandshakeException

#java #ssl

#java #ssl

Вопрос:

У меня есть тривиальная функция «проверить наличие обновлений» в моем настольном приложении, и все, что она делает, это в основном это:

 var url = new URL(urlString);
var conn = url.openConnection();
var stream = conn.getInputStream();
// Just read the latest version number from the stream...
 

Когда я запускаю проверку обновлений из приложения, запущенного из моей IDE, оно работает так, как должно (с использованием JDK 15).

Однако, когда я запускаю проверку обновлений из развернутого приложения (exe-файл под Windows), он завершается ошибкой с исключением:

  javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
    at java.base/sun.security.ssl.Alert.createSSLException(Unknown Source)
    at java.base/sun.security.ssl.Alert.createSSLException(Unknown Source)
    at java.base/sun.security.ssl.TransportContext.fatal(Unknown Source)
    at java.base/sun.security.ssl.Alert$AlertConsumer.consume(Unknown Source)
    at java.base/sun.security.ssl.TransportContext.dispatch(Unknown Source)
    at java.base/sun.security.ssl.SSLTransport.decode(Unknown Source)
    at java.base/sun.security.ssl.SSLSocketImpl.decode(Unknown Source)
    at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(Unknown Source)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
    at myapp.UpdateChecker$checkNow$1.run(UpdateChecker.kt:30)
    at java.base/java.lang.Thread.run(Unknown Source)
 

Недавно я переключился на плагин Gradle Badass Runtime для развертывания приложения, которое использует jlink amp; jpackage под капотом. Среда выполнения JRE, которую он создает, построена на основе того же JDK, который я использую для запуска приложения в моей IDE.

Я действительно понятия не имею, что может быть не так … кроме, возможно, пользовательского JRE, созданного Задирой, отсутствует какой-то компонент / сертификат …?

Я также включил -Djavax.net.debug=all , и он выдал много отладочной информации, но я должен признать, что не могу по-настоящему разобраться в этом. Есть какая-то конкретная строка, которую я должен искать?

Ответ №1:

Хорошо, в стандартной / рекомендуемой конфигурации Badass действительно отсутствовал модуль. Я заставил его работать, добавив в список ‘jdk.crypto.cryptoki’.