Beheben Sie den Javax.Net.SSL.SSLHandshakeException-Fehler
- SSL-Handshakes in Java
-
Behebung der
SSLHandshakeException
wegen fehlendem Serverzertifikat -
Beheben Sie die
SSLHandShakeException
wegen nicht vertrauenswürdigem Serverzertifikat -
Beheben Sie die
SSLHandShakeException
wegen falschem Zertifikat -
Beheben Sie die
SSLHandShakeException
wegen inkompatibler SSL-Version und Cipher Suite
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:
- Zunächst stellt der Client die Liste aller möglichen Cipher Suites und SSL-Versionen bereit.
- Der Server einigt sich dann auf die jeweilige Cipher Suite und die SSL-Version, die mit einem Zertifikat antworten.
- Anschließend extrahiert der Client den öffentlichen Schlüssel aus dem angegebenen Zertifikat und antwortet mit dem neuen verschlüsselten Pre-Master-Schlüssel.
- Anschließend verwendet der Server den privaten Schlüssel, um den Pre-Master-Schlüssel zu entschlüsseln.
- Dann berechnen der Client und der Server das gemeinsame Geheimnis unter Verwendung des Pre-Master-Schlüssels zusammen.
- 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 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 FacebookVerwandter Artikel - Java Error
- Adresse wird bereits verwendet JVM_Bind-Fehler in Java
- Android Java.Lang.IllegalStateException behoben: Methode der Aktivität konnte nicht ausgeführt werden
- Ausnahme im Hauptthread Java.Lang.ClassNotFoundException in IntelliJ IDEA
- Ausnahme im Hauptthread Java.Lang.NoClassDefFoundError
- Beheben Sie das Problem, dass Java nicht installiert werden kann. Es gibt Fehler in den folgenden Schaltern
- Beheben Sie den Fehler `Es wurde keine Java Virtual Machine gefunden` in Eclipse