Falsche Warnung erhalten: handshake_failure durch SSLHandshakeException
Ich habe ein problem mit autorisierten SSL-Verbindung. Erstellt habe ich die Struts-Aktion, die die Verbindung mit einem externen server-mit-Client-Autorisierten SSL-Zertifikat. In meinem Handeln bin ich zu senden versuchen, einige Daten zu bank-server aber ohne Glück, denn ich habe als Ergebnis vom server die folgende Fehlermeldung:
error: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
Meine Methode aus meinem Action-Klasse sendet Daten an server
//Getting external IP from host
URL whatismyip = new URL("http://automation.whatismyip.com/n09230945.asp");
BufferedReader inIP = new BufferedReader(new InputStreamReader(whatismyip.openStream()));
String IPStr = inIP.readLine(); //IP as a String
Merchant merchant;
System.out.println("amount: " + amount + ", currency: " + currency + ", clientIp: " + IPStr + ", description: " + description);
try {
merchant = new Merchant(context.getRealPath("/") + "merchant.properties");
} catch (ConfigurationException e) {
Logger.getLogger(HomeAction.class.getName()).log(Level.INFO, "message", e);
System.err.println("error: " + e.getMessage());
return ERROR;
}
String result = merchant.sendTransData(amount, currency, IPStr, description);
System.out.println("result: " + result);
return SUCCESS;
Meinem Händler.Eigenschaften Datei:
bank.server.url=https://-servernameandport-/
https.cipher=-cipher-
keystore.file=-key-.jks
keystore.type=JKS
keystore.password=-password-
ecomm.server.version=2.0
encoding.source=UTF-8
encoding.native=UTF-8
Für die erste Zeit dachte ich, das ist ein problem mit dem Zertifikat, ich baute es aus .pfx .jks, aber ich habe den selben Fehler, ohne änderungen.
InformationsquelleAutor der Frage Denees | 2011-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den handshake-Fehler entstanden sein könnte, aus verschiedenen Gründen:
Da die zugrunde liegenden Fehler nicht lokalisiert, ist es besser, schalten Sie die
-Djavax.net.debug=all
- flag, um das debugging zu aktivieren der SSL-Verbindung hergestellt. Mit der debug eingeschaltet ist, können Sie erkennen, welche Aktivitäten in der handshake ist fehlgeschlagen.Update
Basierend auf den details, die jetzt verfügbar sind, scheint es, dass das problem durch ein unvollständiges Vertrauen Pfad zwischen den ausgestellten Zertifikat an den server, und root-CA. In den meisten Fällen ist dies, weil das root CA Zertifikat nicht vorhanden ist, die in der trust store -, führt zu der situation, wo ein Zertifikat Vertrauen Pfad nicht existieren kann; das Zertifikat ist im wesentlichen von den nicht vertrauenswürdigen client. Browser eine Warnung, so dass Benutzer können dies ignorieren, aber das ist nicht der Fall für SSL-clients (wie die HttpsURLConnection Klasse, oder ein HTTP-Client-Bibliothek wie Apache HttpComponents-Client).
Meisten dieser client-Klassen/Bibliotheken, die sich darauf verlassen, dass der trust store verwendet, die von der JVM für die Zertifikatsprüfung. In den meisten Fällen wird dies die
cacerts
Datei in die JRE_HOME/lib/security Verzeichnis. Wenn die Lage der trust store angegeben wurde, mit dem JVM-Systemeigenschaftjavax.net.ssl.trustStore
dann ist das speichern in diesem Pfad ist in der Regel die von der client-Bibliothek. Wenn Sie im Zweifel sind, werfen Sie einen Blick auf IhreMerchant
Klasse, und die Abbildung aus der Klasse/Bibliothek wird es verwenden, um die Verbindung zu machen.Hinzufügen des server-Zertifikats der ausstellenden CA zu dieser trust store sollte das problem beheben. Sie können sich auf meine Antwort auf einer ähnlichen Frage auf erste tools für diesen Zweck, aber die Das Java-keytool-Dienstprogramm ist ausreichend für diesen Zweck.
Warnung: Die trust store-ist im wesentlichen eine Liste aller Zertifizierungsstellen, denen Sie Vertrauen. Wenn Sie in ein Zertifikat, das gehört nicht zu einer CA, die Sie nicht Vertrauen, dann SSL/TLS-verbindungen zu Websites, die Zertifikate, ausgestellt von einer Person entschlüsselt werden können, wenn der private Schlüssel verfügbar ist.
Update #2: das Verständnis der Leistung von der JSSE trace
Den keystore und den truststores verwendet, die von der JVM sind in der Regel am Anfang, etwas wie die folgenden:
Wenn die falschen truststore verwendet wird, dann werden Sie brauchen, um re-importieren Sie das Serverzertifikat auf der rechten Seite ein, oder konfigurieren Sie den server für die Verwendung der aufgeführten (nicht empfohlen, wenn Sie mehrere JVMs, und alle von Ihnen sind für unterschiedliche Bedürfnisse verwendet).
Wenn Sie möchten, um zu überprüfen, ob die Liste von trust certs enthält die erforderlichen APZ, dann gibt es einen Abschnitt für die gleiche, die beginnt so:
Müssen Sie Aussehen, wenn die server-CA ist ein Thema.
Den handshake-Prozess wird ein paar auffällige Einträge (Sie müssen wissen, über SSL zu verstehen Sie im detail, aber für die Zwecke der Fehlerbeseitigung das aktuelle problem, es wird genügen, zu wissen, dass ein handshake_failure ist in der Regel berichtet in der ServerHello.
1. ClientHello
Einer Reihe von Einträgen berichtet werden wird, wenn die Verbindung wird initialisiert. Die erste Nachricht, die vom client gesendet wird, in eine SSL/TLS-Verbindungsaufbau ist die ClientHello-Nachricht, in der Regel berichtet in den Protokollen als:
Hinweis: cipher suites verwendet. Diese haben könnte, um Stimmen zu mit dem Eintrag in Ihrem Google merchant.properties-Datei, die für die gleiche Konvention möglicherweise eingesetzt werden, durch die bank, Bibliothek. Wenn die Konvention verwendet wird, unterschiedlich sind, gibt es keinen Grund der Sorge, für die ServerHello Staat wird also, wenn der cipher suite nicht kompatibel ist.
2. ServerHello
Antwortet der server mit einem ServerHello, die angibt, ob die Verbindung das Setupprogramm fortgesetzt werden kann. Einträge in den logs sind in der Regel der folgenden Art:
Beachten Sie die cipher suite, die es gewählt hat; ist dies beste suite zur Verfügung, um sowohl den server und den client. In der Regel wird die cipher-suite ist nicht angegeben, ob es ein Fehler ist. Das Zertifikat des Servers (und Optional der gesamten Kette), die vom server gesendet, und würde gefunden werden, in der Einträge wie:
Wenn die Prüfung des Zertifikats erfolgreich war, finden Sie einen Eintrag ähnlich:
Einer der oben genannten Schritte nicht zum Erfolg geführt hätten, was in der handshake_failure, der händedruck ist in der Regel abgeschlossen zu diesem Zeitpunkt (eigentlich nicht, aber die nachfolgenden Phasen der Handschlag in der Regel nicht bewirken, dass ein handshake-Fehler). Sie müssen herausfinden, welche Schritt fehlgeschlagen, und posten Sie die entsprechende Nachricht als update an die Frage (es sei denn du hast bereits verstanden die Botschaft, und Sie wissen, was zu tun ist, um es zu beheben).
InformationsquelleAutor der Antwort Vineet Reynolds
Ich glaube nicht, dass dies das problem löst der erste Fragesteller, sondern auch für Google-Mitarbeiter, die kommen hier für Antworten:
On update 51 java 1.8 verboten[1] RC4-Verschlüsselungen standardmäßig, wie wir sehen auf der Release Notes Seite:
Wenn Ihr server hat eine starke Präferenz für dieses Verfahren (und die Nutzung dieser Chiffre) kann dies trigger a
handshake_failure
auf java.Test können Sie die Verbindung zum server aktivieren RC4-Verschlüsselungen (versuchen Sie zunächst, ohne
enabled
argument, um zu sehen, wenn die Trigger einehandshake_failure
einstellen und dannenabled
:1 - https://www.java.com/en/download/faq/release_changes.xml
InformationsquelleAutor der Antwort motobói
Installieren der Java Cryptography Extension (JCE) Unlimited Strength (für JDK7 | für JDK8) diesen Fehler beheben wird. Entpacken Sie die Datei, und befolgen Sie die readme-Datei um es zu installieren.
InformationsquelleAutor der Antwort Simon Yu
Dies kann auch geschehen, wenn der client muss ein Zertifikat. Nach der server-Listen die Zertifikat-Kette, kann Folgendes passieren:
3. Zertifikat-Anfrage
Der server wird ein Zertifikat ausstellen Anfrage vom client. Die Anfrage mit einer Liste aller Zertifikate, die der server akzeptiert.
4. Client-Zertifikat-Kette
Dies ist das Zertifikat, das der client an den server senden.
Wenn es nicht ein Zertifikat in der Kette, und der server erfordert, erhalten Sie die handshake-Fehler hier. Eine wahrscheinliche Ursache ist der Pfad zu Ihrem Zertifikat wurde nicht gefunden.
5. Zertifikat Überprüfen,
Der client fragt den server, um das Zertifikat zu überprüfen
Dieser Schritt wird nur geschehen, wenn Sie senden ein Zertifikat.
6. Fertig
Der server antwortet mit einer überprüfe die Antwort
InformationsquelleAutor der Antwort Brig
Den handshake-Fehler könnte einen buggy TLSv1-Protokoll-Implementierung.
In unserem Fall half mit java 7:
Jvm aushandeln, in dieser Reihenfolge. Die Server mit dem neuesten update zu tun, 1.2, der buggy wird nach unten gehen, um v1 und das funktioniert mit dem ähnlichen v1 in java 7.
InformationsquelleAutor der Antwort Bela Vizy
Habe ich diesen Fehler, während ich versuchte mit JDK 1.7.
Wenn ich aktualisiert mein JDK zu jdk1.8.0_66 begann alles zu funktionieren.
Also die einfachste Lösung für dieses problem könnte sein, - aktualisieren Sie Ihre JDK und es konnte anfangen zu arbeiten.
InformationsquelleAutor der Antwort Maxim Votyakov
Vorausgesetzt Sie verwenden die richtige SSL - /TLS-Protokolle, richtig konfiguriert
keyStore
undtrustStore
und bestätigt, dass es nicht vorhanden ist keine Probleme mit den Zertifikaten selbst, Sie müssen möglicherweise stärken Sie Ihre Sicherheits-algorithmen.Wie bereits in Vineet Antwortein möglicher Grund, warum Sie diese Fehlermeldung erhalten, ist aufgrund inkompatibler cipher suites verwendet wird. Durch die Aktualisierung meiner
local_policy
undUS_export_policy
Gläser in mein JDK istsecurity
Ordner mit den in der Java Cryptography Extension (JCE)ich war in der Lage, um das handshake erfolgreich.InformationsquelleAutor der Antwort heez
Mir war ein
TLS
version nicht kompatibel Fehler.Früher war es
TLSv1
ich habe esTLSV1.2
dies mein problem gelöst.InformationsquelleAutor der Antwort Ali786
Ich hatte ein ähnliches Problem; ein Upgrade auf Apache-HTTPClient 4.5.3 behoben.
InformationsquelleAutor der Antwort Hazel Troost
Ich das gleiche problem heute mit OkHttp-client, um eine https-basierte url sein. Es war verursacht durch Https-Protokoll-version und Cipher-Methode Missverhältnis zwischen der server-Seite und client-Seite.
1) überprüfen Sie Ihre website https-Protokoll version und Cipher-Methode.
openssl>s_client -connect your_website.com:443 -showcerts
Erhalten Sie viele detail-info, die key-info ist wie folgt aufgelistet:
2) config-http-client, zum Beispiel, in Client OkHttp Fall:
Diese werden bekommen, was wir wollen.
InformationsquelleAutor der Antwort Armstrongya
Fand ich einen HTTPS-server, die nicht in dieser Weise, wenn meine Java-client-Verfahren konfiguriert wurde, mit
Die Verbindung ist fehlgeschlagen mit
handshake_failure
nach derServerHello
hatte, erfolgreich abgeschlossen, aber bevor der Datenstrom gestartet.Gab es keine klare Fehlermeldung, die das problem erkannt, der Fehler sah aus wie
Ich isoliert das Problem, indem Sie versuchen mit und ohne den "
-Djsse.enableSNIExtension=false
" - optionInformationsquelleAutor der Antwort Rich
Disclaimer : ich bin nicht bewusst, wenn die Antwort hilfreich sein wird für viele Menschen,gerade teilen, weil es könnte .
War ich immer diesen Fehler bei der Verwendung von Parasoft SOATest auf Anfrage senden XML(SOAP) .
Das Problem war, dass ich hatte die falsche alias aus der dropdown-nach hinzufügen des Zertifikats und authentifizieren.
InformationsquelleAutor der Antwort user3251882
Ich bin mit com.google.api-http-client. Wenn ich kommunizieren mit einem internen Unternehmens-Website, ich habe das problem, wenn ich irrtümlich verwendet https, statt http.
InformationsquelleAutor der Antwort thebiggestlebowski
In meinem Fall, cert importiert, der Fehler bleibt, löste dies durch hinzufügen
System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,SSLv3");
vor dem schließenInformationsquelleAutor der Antwort molly gu