Beheben Sie den Javax.Net.SSL.SSLHandshakeException-Fehler

Sheeraz Gul 20 Juni 2023
  1. SSL-Handshakes in Java
  2. Behebung der SSLHandshakeException wegen fehlendem Serverzertifikat
  3. Beheben Sie die SSLHandShakeException wegen nicht vertrauenswürdigem Serverzertifikat
  4. Beheben Sie die SSLHandShakeException wegen falschem Zertifikat
  5. Beheben Sie die SSLHandShakeException wegen inkompatibler SSL-Version und Cipher Suite
Beheben Sie den Javax.Net.SSL.SSLHandshakeException-Fehler

Dieses Tutorial demonstriert den Fehler javax.net.ssl.SSLHandshakeException in Java.

SSL-Handshakes in Java

Die SSL-Handshakes werden für den Client und den Server verwendet, um Vertrauen und Logistik aufzubauen, die zum Sichern der Verbindung über das Internet erforderlich sind. Es gibt typische Schritte bei SSL-Handshake-Vorgängen, die befolgt werden müssen:

  1. Zunächst stellt der Client die Liste aller möglichen Cipher Suites und SSL-Versionen bereit.
  2. Der Server einigt sich dann auf die jeweilige Cipher Suite und die SSL-Version, die mit einem Zertifikat antworten.
  3. Anschließend extrahiert der Client den öffentlichen Schlüssel aus dem angegebenen Zertifikat und antwortet mit dem neuen verschlüsselten Pre-Master-Schlüssel.
  4. Anschließend verwendet der Server den privaten Schlüssel, um den Pre-Master-Schlüssel zu entschlüsseln.
  5. Dann berechnen der Client und der Server das gemeinsame Geheimnis unter Verwendung des Pre-Master-Schlüssels zusammen.
  6. Abschließend tauschen Client und Server Nachrichten aus, die die erfolgreiche Verschlüsselung und Entschlüsselung des gemeinsamen Geheimnisses bestätigen.

Die SSL-Handshakes haben zwei Arten. Das erste ist das unidirektionale SSL, bei dem der Server allen Clients vertrauen muss, und das zweite ist das bidirektionale SSL, bei dem Client und Server die Zertifikate des jeweils anderen akzeptieren müssen.

Nachdem wir die SSL-Handshakes verstanden haben, können wir nun die SSLHandShakeException im Detail besprechen. Es gibt zwei Szenarien von SSLHandShakeException, die unten angegeben sind.

Behebung der SSLHandshakeException wegen fehlendem Serverzertifikat

Wenn ein SSL-Handshake-Vorgang, wenn der Client eine Verbindung zum Server herstellt, kein Zertifikat erhalten hat, würde er die unten erwähnte SSLHandShakeException auslösen:

Exception in thread "main" javax.net.ssl.SSLHandshakeException:
  Received fatal alert: handshake_failure

Um dieses Problem zu lösen, stellen Sie sicher, dass Sie alle oben genannten Schritte ausführen. Dieses Problem tritt auf, wenn der Schlüsselspeicher oder die Systemeigenschaften nicht richtig eingegeben werden.

Keystores sind die von den Behörden bereitgestellten Zertifikate, oder wir können unsere Keystores auch mit der keytool-Funktionalität von JDK erstellen. Hier ein Beispiel für den Keystore:

$ keytool -genkey -keypass password \
                  -storepass password \
                  -keystore Server_Keystore.jks

Der obige keytool-Code wird in die Keystore-Datei geschrieben. Nun kann mit dem keytool ein öffentliches Zertifikat aus der oben generierten Keystore-Datei extrahiert werden:

$ keytool -export -storepass password \
                  -file NewServer.cer \
                  -keystore Server_Keystore.jks

Der obige Code exportiert das öffentliche Zertifikat aus dem Keystore als Datei NewServer.cer. Jetzt können wir es dem Truststore für den Client hinzufügen:

$ keytool -import -v -trustcacerts \
                     -file NewServer.cer \
                     -keypass password \
                     -storepass password \
                     -keystore Client_Truststore.jks

Nun werden der Keystore für den Server und der Truststore für den Client generiert. Wir können sie mit einem Befehl als Systemeigenschaften an den Server übergeben:

-Djavax.net.ssl.keyStore=Client_Keystore.jks -Djavax.net.ssl.keyStorePassword=password

Es ist für die Systemeigenschaft erforderlich. Der Pfad der Keystore-Datei muss absolut sein oder die Keystore-Datei in demselben Verzeichnis platzieren, aus dem der Befehl aufgerufen wird.

Die relativen Pfade werden nicht unterstützt. Sobald Sie diesem Vorgang folgen, wird der Fehler des fehlenden Zertifikats behoben und es wird keine SSLHandShakeException mehr geben.

Beheben Sie die SSLHandShakeException wegen nicht vertrauenswürdigem Serverzertifikat

Der andere Grund für SSLHandShakeException ist ein nicht vertrauenswürdiges Serverzertifikat. Wenn ein Server ein selbstsigniertes Zertifikat verwendet, das nicht von Autoritäten signiert ist, wird der folgende Fehler ausgegeben:

Exception in thread "main" 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

Diese Ausnahme wird ausgelöst, wenn das Zertifikat von einer anderen Entität als dem Standardspeicher signiert wird. Der Standard-Truststore in JDK liefert die Informationen zu verwendeten gemeinsamen Zertifikaten.

Dieses Problem kann gelöst werden, indem der Client gezwungen wird, dem vom Server vorgelegten Zertifikat zu vertrauen. Wir müssen den oben generierten Truststore verwenden und als Systemeigenschaften an den Client übergeben:

-Djavax.net.ssl.trustStore=Client_Truststore.jks -Djavax.net.ssl.trustStorePassword=password

Dadurch wird die Ausnahme behoben, aber es ist keine ideale Situation. Im Idealfall können wir das selbstsignierte Zertifikat verwenden, das von der Zertifizierungsstelle (CA) zertifiziert werden sollte, dann kann der Client ihnen standardmäßig vertrauen.

Beheben Sie die SSLHandShakeException wegen falschem Zertifikat

Ein Handshake kann auch aufgrund eines falschen Zertifikats fehlschlagen. Wenn ein Zertifikat nicht richtig erstellt wird, wird es die SSLHandShakeException auslösen:

Exception in thread "main" javax.net.ssl.SSLHandshakeException:
    java.security.cert.CertificateException:
    No name matching localhost found

Führen Sie den folgenden Befehl aus, um zu überprüfen, ob das Zertifikat ordnungsgemäß erstellt wurde:

keytool -v -list -keystore Server_Keystore.jks

Der obige Befehl zeigt die Details des Keystore-Eigentümers an:

...
Owner: CN=localhost, OU=technology, O=delftstack, L=city, ST=state, C=xx
..

Der CN des Besitzers muss mit dem CN des Servers übereinstimmen, und wenn er nicht übereinstimmt, wird dieselbe Ausnahme ausgelöst, die oben gezeigt wird, da sie aufgrund des anderen CN generiert wird.

Beheben Sie die SSLHandShakeException wegen inkompatibler SSL-Version und Cipher Suite

Während eines SSL-Handshake-Vorgangs ist es möglich, dass es verschiedene kryptografische Protokolle wie verschiedene Versionen von SSL, TLS usw. gibt. Während Client und Server sich auf kryptografische Protokolle und Versionen bei einem Handshake einigen müssen, wird SSL durch TLS für ersetzt seine kryptographische Stärke.

Wenn nun beispielsweise der Server das Protokoll SSL3 und der Client das Protokoll TLS1.3 verwendet, können sich beide nicht auf das kryptografische Protokoll einigen und es wird die SSLHandShakeException geworfen:

Exception in thread "main" javax.net.ssl.SSLHandshakeException:
  No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

Um dieses Problem zu lösen, müssen wir sicherstellen, dass Client und Server entweder dieselben oder kompatible kryptografische Protokolle verwenden.

Ebenso ist es notwendig, die kompatible Cipher Suite zu haben. Während eines Handshakes stellt der Client die Liste der Chiffren bereit, und der Server wählt eine zu verwendende Chiffre aus.

Wenn der Server keine passende Chiffre auswählen kann, wirft der Code die folgende SSLHandShakeException:

Exception in thread "main" javax.net.ssl.SSLHandshakeException:
  Received fatal alert: handshake_failure

Normalerweise verwenden der Client und der Server eine Vielzahl von Verschlüsselungssammlungen; Deshalb kann dieser Fehler auftreten. Der Fehler tritt auf, weil ein Server eine sehr selektive Verschlüsselung gewählt hat.

Um dieses Problem zu vermeiden, verwendet der Server eine Liste ausgewählter Verschlüsselungen, was auch der Sicherheit zugute kommt.

Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

Verwandter Artikel - Java Error