При работе с безопасными соединениями через Интернет вы можете столкнуться с исключением SSLHandshakeException с сообщением об ошибке «Проверка цепочки не удалась». Эта ошибка обычно возникает, когда сертификат SSL, представленный сервером, не может быть проверен хранилищем доверенных сертификатов клиента. В этом сообщении блога мы рассмотрим пять распространенных решений для устранения ошибки SSLHandshakeException при проверке цепочки. Мы предоставим примеры кода на Java для иллюстрации каждого решения.
Решение 1. Проверьте системные часы и настройки часового пояса
Одной из распространенных причин ошибки проверки цепочки является несоответствие между системными часами и фактическим временем. Убедитесь, что системные часы точны и соответствуют текущему времени в правильном часовом поясе. Вот пример того, как проверить и установить системные часы в Java:
import java.util.Date;
public class SystemClockExample {
public static void main(String[] args) {
Date currentDate = new Date();
System.out.println("Current system time: " + currentDate);
}
}
Решение 2. Обновите JDK и хранилище доверенных сертификатов
Устаревшие версии JDK или просроченные сертификаты SSL в хранилище доверенных сертификатов могут привести к ошибке проверки цепочки. Убедитесь, что у вас установлена последняя версия JDK, и обновите хранилище доверенных сертификатов новейшими сертификатами SSL. Вот фрагмент кода для программного обновления хранилища доверенных сертификатов на Java:
import javax.net.ssl.*;
public class TruststoreUpdateExample {
public static void main(String[] args) throws Exception {
String truststorePath = "/path/to/truststore.jks";
char[] truststorePassword = "password".toCharArray();
System.setProperty("javax.net.ssl.trustStore", truststorePath);
System.setProperty("javax.net.ssl.trustStorePassword", new String(truststorePassword));
SSLContext sslContext = SSLContext.getDefault();
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
// Use the updated socketFactory for your SSL connections
}
}
Решение 3. Проверьте промежуточную цепочку сертификатов
Цепочка сертификатов SSL состоит из нескольких сертификатов, включая сертификат сервера и промежуточные сертификаты. Убедитесь, что все промежуточные сертификаты правильно настроены и включены в хранилище доверенных сертификатов. Для проверки цепочки сертификатов в Java можно использовать следующий фрагмент кода:
import javax.net.ssl.*;
public class IntermediateCertificateExample {
public static void main(String[] args) throws Exception {
String serverURL = "https://example.com";
SSLContext sslContext = SSLContext.getDefault();
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
SSLSocket socket = (SSLSocket) socketFactory.createSocket(serverURL, 443);
socket.startHandshake();
SSLSession session = socket.getSession();
Certificate[] certificates = session.getPeerCertificates();
// Check the certificates in the chain
}
}
Решение 4. Отключите проверку отзыва сертификатов
Иногда ошибка сбоя проверки цепочки может возникнуть из-за проблем с проверкой отзыва сертификата. Вы можете временно отключить эти проверки, чтобы посмотреть, устранит ли это ошибку. Вот пример отключения проверки отзыва сертификатов в Java:
import javax.net.ssl.*;
public class CertificateRevocationExample {
public static void main(String[] args) throws Exception {
SSLContext sslContext = SSLContext.getDefault();
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
// Perform SSL/TLS operations without certificate revocation checks
}
}
Решение 5. Проверьте конфигурацию сервера
Если ни одно из вышеперечисленных решений не помогло, необходимо проверить конфигурацию SSL/TLS сервера. Убедитесь, что сертификат сервера действителен, а цепочка сертификатов правильно настроена на стороне сервера. Кроме того, проверьте наличие неправильных конфигураций или проблем совместимости с протоколами SSL/TLS и наборами шифров.
Ошибку SSLHandshakeException при проверке цепочки не удалось устранить, используя различные методы устранения неполадок. В этой статье мы обсудили пять распространенных решений с примерами кода на Java. Выполнив эти действия, вы сможете диагностировать и устранить ошибку, гарантируя безопасные и успешные соединения SSL/TLS.