Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
16 Ноя 2024
2 мин
2699

Решение проблемы javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

Эта ошибка возникает, когда Java-приложение не может создать доверенное TLS / SSL-соединение. Возможно, приложение пытается подключиться к серверу через

Эта ошибка возникает, когда 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());

В любом случае, лучше всегда использовать доверенные сертификаты от известных центров сертификации, чтобы избежать возможных проблем с безопасностью.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий