it-swarm.com.de

SSL "Peer nicht authentifiziert" Fehler mit HttpClient 4.1

Ich baue einen einfachen App-Monitor, um eine unserer API-URLs abzufragen und uns eine E-Mail zu senden, wenn aus der Antwort kein HTTP 200-Statuscode abgerufen werden kann (dies bedeutet, dass unsere API aus irgendeinem Grund inaktiv ist).

Ich verwende HttpClient 4.1 (dies ist wichtig, da die API stark von 3.x unterscheidet).

Unsere API ist sicher mit SSL, jedoch muss Folgendes eingegeben werden:

http://example.com/our-api

in einen Webbrowser leitet Sie weiter

https://example.com/our-api

Ohne Fehler zu verursachen.

Wenn HttpClient versucht, diese URL (http://example.com/our-api) zu treffen, schlägt die Ausnahme mit einer javax.net.ssl.SSLPeerUnverifiedException-Ausnahme mit der folgenden Meldung fehl:

peer nicht authentifiziert

Ich sehe, dass dies für andere Menschen sehr häufig geschieht, wie durch this post (was auch einige Möglichkeiten bietet, dieses Problem zu umgehen - eine Lösung, die ich heute Abend tatsächlich umsetzen werde).

Was dieser andere Post (und die anderen ihm ähnlichen) nicht tun, ist zu erklären, warum dies überhaupt geschieht. Anstatt zu fragen "wie kann ich das beheben?" Ich dachte, ich würde fragen "warum passiert das?". Bevor ich mit einer der vorgeschlagenen Lösungen fortfahre, möchte ich wissen, was das Problem ist, das ich zu beheben versuche ;-)

20
IAmYourFaja

Wenn das Serverzertifikat selbstsigniert ist, funktioniert es wie vorgesehen, und Sie müssen das Serverzertifikat in Ihren Keystore importieren.

Unter der Annahme, dass das Serverzertifikat von einer bekannten Zertifizierungsstelle signiert wird, geschieht dies, da der für einen modernen Browser verfügbare Satz von Zertifizierungsstellenzertifikaten viel größer ist als der im JDK/JRE enthaltene, begrenzte Satz.

Die EasySSL-Lösung, die in einem der von Ihnen genannten Beiträge angegeben ist, verdeckt nur den Fehler und Sie wissen nicht, ob der Server über ein gültiges Zertifikat verfügt.

Sie müssen die richtige Stammzertifizierungsstelle in Ihren Keystore importieren, um das Zertifikat zu überprüfen. Es gibt einen Grund, warum Sie dies mit dem gängigen SSL-Code nicht umgehen können. Das soll Sie daran hindern, Programme zu schreiben, die sich so verhalten, als wären sie sicher, aber nicht.

24
Jim Garrison

Dies wird geworfen wenn 

... der Peer konnte sich nicht selbst identifizieren (z. B. kein Zertifikat Die jeweils verwendete Verschlüsselungssuite unterstützt keine Authentifizierung, oder es wurde keine Peer-Authentifizierung während SSL Handshaking eingerichtet) diese Ausnahme ist geworfen.

Möglicherweise zeigt die Ursache dieser Ausnahme (wo ist der Stacktrace), warum diese Ausnahme ausgelöst wird. Höchstwahrscheinlich enthält der mit Java ausgelieferte Standard-Keystore das Stammzertifikat des verwendeten TTP nicht (und vertraut nicht darauf).

Die Antwort besteht darin, das Stammzertifikat abzurufen (z. B. von der SSL-Verbindung Ihres Browsers), es in die Datei cacerts zu importieren und es mit keytool zu vertrauen, das vom Java-JDK ausgeliefert wird. Andernfalls müssen Sie einen anderen Trust Store programmgesteuert zuweisen.

6
Maarten Bodewes
keytool -import -v -alias cacerts -keystore cacerts.jks -storepass changeit -file C:\cacerts.cer
1
vaquar khan

Ich bin kein Java-Entwickler, habe aber eine Java-App zum Testen einer RESTful-API verwendet. Um den Fehler zu beheben, musste ich die Zwischenzertifikate im Webserver installieren, damit der Fehler behoben werden konnte. Ich habe lighttpd verwendet, das ursprüngliche Zertifikat wurde auf einem IIS Server installiert. Ich hoffe es hilft. Dies waren die Zertifikate, die mir auf dem Server fehlten. 

  • CA.crt
  • UTNAddTrustServer_CA.crt
  • AddTrustExternalCARoot.crt
0
pabloh007