Эта ошибка возникает, когда Java-приложение не может создать доверенное TLS / SSL-соединение. Возможно, приложение пытается подключиться к серверу через HTTPS и сервер использует самоподписанный сертификат или сертификат, не принятый узлом Java.
Пример: Приложение работает на Tomcat и пытается подключиться к другому приложению на том же или другом сервере через HTTPS. Если второе приложение использует самоподписанный сертификат или сертификат, не принятый Java, первое приложение получит вышеуказанную ошибку.
Разработка на Java — востребованное направление, такие специалисты будут нужны на рынке еще долго. На курсе «Java-разработчик» от Skypro освоить профессию можно с нуля за 11 месяцев, даже если вы гуманитарий и ничего не знаете об IT. Программа составлена от простого к сложному и адаптирована для новичков. Преподаватели — практикующие специалисты из крупных компаний: «Сбер», «Самокат» и других.
Проблема
Java имеет свой собственный хранилище доверенных сертификатов, называемое cacerts
. Если сервер, к которому приложение пытается подключиться, использует сертификат, который не находится в этом хранилище, Java не доверяет этому серверу и отклоняет соединение, вызывая ошибку SSLHandshakeException.
Возможные решения
Добавление сертификата в доверенное хранилище Java
Сначала нужно получить сертификат от сервера. Это можно сделать, подключившись к серверу через любой веб-браузер и экспортировав сертификат.
Затем нужно добавить этот сертификат в доверенное хранилище Java с помощью утилиты keytool
, включенной в Java:
keytool -import -alias server-alias -keystore $JAVA_HOME/jre/lib/security/cacerts -file server.cer
Вам потребуется пароль keystore. По умолчанию это «changeit».
Освойте Java на курсе онлайн-университета Skypro. Учебе нужно будет уделять всего 10 часов в неделю: сможете совмещать с работой и личными делами. Вас ждут 440 часов теории и практики, мастер-классы с реальными рабочими задачами, опытные преподаватели, кураторы и наставники. За время обучения сделаете два полноценных проекта для портфолио и множество домашних заданий, чтобы отработать навыки.
Использование кастомного TrustManager
Можно настроить Java использовать кастомный TrustManager
, который доверяет всем сертификатам. Но это может привести к уязвимостям безопасности, так как приложение становится уязвимым для атаки «человек посередине» (Man-in-the-Middle).
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) { } public void checkServerTrusted(X509Certificate[] certs, String authType) { } } }; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
В любом случае, лучше всегда использовать доверенные сертификаты от известных центров сертификации, чтобы избежать возможных проблем с безопасностью.
Добавить комментарий