В процессе разработки исключение установления соединения Java SSL (безопасный уровень сокетов) является распространенной ошибкой сетевой связи.,Особенно при использованииHTTPSпротокол При безопасном общении。В этой статье будет подробно разобранjavax.net.ssl.SSLHandshakeException: SSL
Этот необычный фон、возможные причины,Приведены примеры кода, которые помогут вам понять и решить проблему.
javax.net.ssl.SSLHandshakeException
это своего родаSSL/TLSИсключение произошло во время рукопожатия,Обычно происходит, когда между клиентом и сервером установлено безопасное соединение. Подтверждение SSL является важным шагом в обеспечении безопасности связи между обеими сторонами.,К ним относятся проверка сертификатов, согласование алгоритмов шифрования и генерация симметричных ключей. Если в ходе этого процесса возникнут какие-либо проблемы,Например, сертификат недействителен или не доверен, не совпадает версия протокола и т. д.,Это приведет к сбою установления связи SSL.,таким образом бросаяSSLHandshakeException
。
Предположим, мы пытаемся получить доступ к API через HTTPS-запрос в Java-приложении:
URL url = new URL("https://example.com/api");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("GET");
InputStream response = connection.getInputStream();
Если SSL-сертификат сервера не пользуется доверием клиента,Или проблема с сертификатом,При запуске приведенного выше кода он выдастSSLHandshakeException
。
привести кjavax.net.ssl.SSLHandshakeException
Причины в основном заключаются в следующем:
Следующее дает возможностьпривести кSSLHandshakeException
пример кода:
import javax.net.ssl.HttpsURLConnection;
import java.io.InputStream;
import java.net.URL;
public class SSLHandshakeExample {
public static void main(String[] args) {
try {
URL url = new URL("https://self-signed.badssl.com/");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("GET");
InputStream response = connection.getInputStream();
// Обработка ответа
} catch (Exception e) {
e.printStackTrace();
}
}
}
В этом примере,клиент Попытка доступа к серверу с использованием самозаверяющего сертификатасерверhttps://self-signed.badssl.com/
。из-за самоподписанного Сертификат не былдоверять,SSLБудет брошен во время рукопожатияSSLHandshakeException
,и соединение не будет установлено.
чтобы решитьSSLHandshakeException
,Мы можем выбрать один из следующих методов:
import javax.net.ssl.*;
import java.io.InputStream;
import java.net.URL;
import java.security.cert.X509Certificate;
public class SSLHandshakeSolution {
public static void main(String[] args) {
try {
// Создайте диспетчер доверия, который доверяет всем сертификатам.
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
// Установите глобальный диспетчер доверия
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// Выполнение HTTPS-запросов
URL url = new URL("https://self-signed.badssl.com/");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("GET");
InputStream response = connection.getInputStream();
// Обработка ответа
} catch (Exception e) {
e.printStackTrace();
}
}
}
# Используйте keytool для импорта сертификата сервера в хранилище доверенных сертификатов клиента.
keytool -import -alias example -file server-cert.pem -keystore cacerts
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(SSLSocketFactory.getDefault());
// Обязательно используйте совместимую версию TLS.
connection.setEnabledProtocols(new String[]{"TLSv1.2", "TLSv1.3"});
РазрешениеSSLHandshakeException
час,Обратите внимание на следующее:
С помощью вышеуказанных методов,Вы можете эффективно решитьjavax.net.ssl.SSLHandshakeException: SSL
вопрос,Убедитесь, что ваши Java-приложения могут безопасно и стабильно обмениваться данными по сети. Надеюсь, эта статья будет вам полезна,Позволяет глубже понять и устранить эту распространенную аномалию установления связи SSL.