Java SSL-Validierung deaktivieren

MD Aminul Islam 12 Oktober 2023
Java SSL-Validierung deaktivieren

Wenn wir versuchen, eine Verbindung zu einer URL herzustellen, erhalten Sie manchmal einen SSLHandshakeException- oder IOException-Fehler. Der Grund für diesen Fehler ist der fehlende Aufbau einer SSL-verschlüsselten Verbindung.

Wenn wir in Java versuchen, eine SSL-Verbindung zu öffnen, führt die JSSE-Implementierung des SSL-Protokolls einen Validierungsprozess durch, um zu prüfen, ob der angeforderte Host echt oder falsch ist. Diese Überprüfung beinhaltet die Validierung des X.509-Zertifikats des Servers.

Dieser Artikel zeigt, wie wir diese Zertifikatsvalidierung beim Erstellen einer HTTP-Verbindung deaktivieren können. Außerdem schreiben wir einen Beispielcode mit einer Erklärung zum Thema, um es leicht verständlich zu machen.

Java-Deaktivierung SSL-Validierung

Bevor wir uns der Lösung zuwenden, schauen wir uns den folgenden Fehler an, den wir erhalten, wenn wir versuchen, eine Verbindung mit einer URL herzustellen:

Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:110)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:149)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:202)

Die oben genannten Ausnahmen können vermieden werden, indem die Host Verification und die Certificate Validation für SSL abgeschaltet werden. Um dies zu erreichen, können Sie dem folgenden Beispiel folgen.

Lösung: Deaktivieren Sie die Host Verification & Certificate Validation

In unserem Beispiel unten haben wir gezeigt, wie wir die Host Verification und die Certificate Validation ausschalten können. Siehe folgenden Code.

Beispielcode:

// importing necessary packages
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

// Our main class
public class DisableSSL {
  public static void main(String[] args) throws Exception {
    // Creating a Trust Manager.
    TrustManager[] TrustMgr = new TrustManager[] {
        new X509TrustManager(){public X509Certificate[] getAcceptedIssuers(){return null;
  }

  // No Checking required
  public void checkClientTrusted(X509Certificate[] certs, String authType) {}

  // No Checking required
  public void checkServerTrusted(X509Certificate[] certs, String authType) {}
}
}
;

// Installing the Trast manager
SSLContext SSLCont = SSLContext.getInstance("SSL");
SSLCont.init(null, TrustMgr, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(SSLCont.getSocketFactory());

// Creating an all-trusting verifier for Host Name
HostnameVerifier ValidHost = new HostnameVerifier() {
  public boolean verify(String HostName, SSLSession MySession) {
    return true;
  }
};

// Installing an all-trusting verifier for the HOST
HttpsURLConnection.setDefaultHostnameVerifier(ValidHost);
URL MyURL = new URL("https://www.example.com/"); // The location URL
URLConnection connect = MyURL.openConnection(); // Openning the URL connection
Reader MyReader = new InputStreamReader(connect.getInputStream()); // Creating a reader

while (true) { // Processing the reader data
  int Chars = MyReader.read();
  if (Chars == -1) {
    break;
  }
  System.out.print((char) Chars);
}
}
}

Den Zweck jeder Zeile haben wir bereits über Kommentare beschrieben. Wenn Sie sich den Code jedoch genau ansehen, werden Sie feststellen, dass wir für den checkClientTrusted und den checkServerTrusted nichts definiert haben.

Auf diese Weise umgehen wir die Validierung. Daher wird die Ausführung des obigen Beispielcodes eine Ausgabe wie die unten auf Ihrer Konsole erhalten.

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 2em;
        background-color: #fdfdff;
        border-radius: 0.5em;
        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
MD Aminul Islam avatar MD Aminul Islam avatar

Aminul Is an Expert Technical Writer and Full-Stack Developer. He has hands-on working experience on numerous Developer Platforms and SAAS startups. He is highly skilled in numerous Programming languages and Frameworks. He can write professional technical articles like Reviews, Programming, Documentation, SOP, User manual, Whitepaper, etc.

LinkedIn

Verwandter Artikel - Java SSL