Akzeptieren-server selbst signiertes ssl-Zertifikat im Java-client
Sieht es aus wie eine standard-Frage, aber ich konnte nicht finden, klare Anweisungen überall.
Habe ich java-code versucht eine Verbindung zu einem server mit wahrscheinlich selbst signiertes (oder abgelaufene) Zertifikat. Der code meldet den folgenden Fehler :
[HttpMethodDirector] I/O exception (javax.net.ssl.SSLHandshakeException) caught
when processing request: sun.security.validator.ValidatorException: PKIX path
building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
Wie ich es verstehe, muss ich keytool und sagen java, dass es OK ist, damit diese Verbindung.
Alle Anweisungen zum beheben dieses Problems annehmen, ich bin voll und ganz beherrschen mit keytool, wie
generieren einen privaten Schlüssel für server und importieren Sie Sie in die keystore -
Ist es wer posten könnte detaillierte Anweisungen?
Ich bin mit unix, also bash-Skript wäre am besten.
Nicht sicher, ob es wichtig ist, aber code ausgeführt jboss.
Danke für den link, ich habe es nicht gesehen bei der Suche. Aber beide Lösungen beinhalten spezielle Codes, um eine Anfrage zu senden und ich bin mit den bestehenden code (amazon-ws-client für java). Beziehungsweise, es ist Ihre Seite und ich bin mir anschließen und ich kann das nicht beheben Ihre Probleme mit Zertifikaten.
"Natürlich wäre es besser, wenn Sie die Seite verwenden, ein gültiges cert..." - Ein selbst signiertes Zertifikat ist ein gültiges Zertifikat wenn der client vertraut. Viele glauben übertragung Vertrauen des CA/Browser-Kartell ist ein Sicherheits-Mangel.
Verwandte, finden Sie unter Die meisten gefährlichen code in the world: validating SSL certificates in non-browser software. (Der link wird zur Verfügung gestellt, da Sie zu sein scheinen immer diese Spam Antworten, dass die überprüfung deaktivieren).
InformationsquelleAutor Nikita Rybak | 2010-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie grundsätzlich zwei Möglichkeiten: fügen Sie das selbstsignierte Zertifikat auf Ihrem JVM truststore oder konfigurieren Sie Ihren client, um
Option 1
Exportieren Sie das Zertifikat aus Ihrem browser und importieren Sie es in Ihre JVM truststore (aufbauen einer Kette des Vertrauens):
Option 2
Deaktivieren Der Zertifikatsprüfung:
Beachten Sie, dass ich nicht empfehlen, die Option #2 -. Deaktivieren Sie den trust-manager Niederlagen einige Teile von SSL und macht Sie anfällig für man-in-the-middle-Angriffen. Bevorzugen Option #1 oder, noch besser, den server, verwenden Sie einen "echten" Zertifikat von einer bekannten CA.
Ich bin wirklich nicht zu empfehlen die zweite option (habe ich aktualisiert meine Antwort deutlich zu machen). Allerdings nicht posten es wird nichts lösen (dies ist die öffentliche Informationen) und nicht IMHO verdient ein downvote.
Es ist von den Menschen beizubringen, dass Sie Sie erziehen, nicht durch das verstecken von Dingen. So halten Dinge geheim oder im verborgenen, ist nicht eine Lösung überhaupt. Dieser code ist öffentlich, die Java-API öffentlich ist, ist es besser darüber zu sprechen als es zu ignorieren. Aber damit kann ich Leben, mit Ihnen nicht einverstanden ist.
Die andere option – die, die man nicht erwähnen – ist das Zertifikat des Servers fest entweder durch die Festsetzung es sich selbst, oder durch den Aufruf der entsprechenden support-Menschen. Single-host-Zertifikate sind wirklich sehr Billig, futzing um mit einem selbst-signierten Zeug ist penny-wise, pound-foolish (D. H., für diejenigen, die nicht vertraut mit dem englischen idiom, einen völlig unsinnigen Satz von Prioritäten, die Kosten viel zu sparen, fast nichts).
6 Jahre zu spät, aber Sie können auch halten Sie von der server-cert in firefox, indem Sie auf das Schloss-Symbol -> mehr Informationen -> Zertifikat Anzeigen -> Registerkarte Details -> Exportieren... Es ist zu gut versteckt.
InformationsquelleAutor Pascal Thivent
Ich jagte hinunter, dieses problem zu einem Zertifikat-Anbieter, die nicht Teil der Standard-JVM-vertrauenswürdigen hosts als von
JDK 8u74
. Der Anbieter ist http://www.identrust.com, aber das war nicht die Domäne habe ich versucht, eine Verbindung herzustellen. Diese Domäne bekommen hatte, sein Zertifikat von diesem Anbieter. Sehen Wird das Kreuz root-Abdeckung Vertrauen, indem Sie die Standard-Liste in der JDK/JRE? -- Lesen Sie unten ein paar Einträge. Siehe auch Welche Browser und Betriebssysteme unterstützen die Let ' s Encrypt.So, um die Verbindung zu der Domäne, an dem ich interessiert war, hatte ein Zertifikat von
identrust.com
ich habe die folgenden Schritte. Im Grunde genommen, ich hatte die identrust.com (DST Root CA X3
) dem Zertifikat Vertrauen, indem Sie die JVM. Ich war in der Lage zu tun, dass die Verwendung von Apache HttpComponents 4.5 wie so:1: Erhalten Sie das Zertifikat aus indettrust bei Zertifikat-Chain-Download-Anweisungen. Klicken Sie auf die DST Root CA X3 link.
2: Speichern Sie die Zeichenfolge in eine Datei mit dem Namen "DST Root CA X3.pem". Werden Sie sicher, dass Sie die Zeilen "-----BEGIN CERTIFICATE-----" und "-----END CERTIFICATE-----" in der Datei am Anfang und am Ende.
3: Erstellen Sie eine java-keystore-Datei cacerts.jks mit dem folgenden Befehl:
4: Kopieren Sie die resultierende cacerts.jks keystore in das Ressourcen-Verzeichnis Ihrer java - /(maven) application.
5: den folgenden code Verwenden, um diese Datei zu laden und befestigen Sie es an der Apache 4.5 HttpClient. Das wird das problem lösen für alle domains haben, die Zertifikate aus
indetrust.com
util oracle schließt das Zertifikat in den JRE default-keystore.Wenn das Projekt baut dann die cacerts.jks wird kopiert und in den classpath geladen und von dort aus. Ich wusste nicht, an diesem Punkt in der Zeit, test gegen andere ssl-Seiten, aber wenn der obige code "Ketten", die in diesem Zertifikat arbeiten Sie auch, aber wieder, ich weiß es nicht.
Referenz: Benutzerdefinierte SSL-Kontext und Wie übernehme ich ein selbst-signiertes Zertifikat in einen Java-HttpsURLConnection?
Lesen Sie die Frage (und Antwort) ein wenig näher.
InformationsquelleAutor K.Nicholas
Apache HttpClient 4.5 unterstützt die Annahme selbst-signierte Zertifikate:
Dieser baut eine SSL-socket-factory, die die
TrustSelfSignedStrategy
registriert es mit einem benutzerdefinierten Verbindungs-manager, dann funktioniert ein HTTP GET mit, dass der connection manager.Ich Stimme mit denen, die singen "don' T tun dies in der Produktion", es gibt jedoch Anwendungsfälle für die Annahme, selbst-signierte Zertifikate außerhalb der Produktion; wir verwenden Sie in automatisierten Integrationstests, so dass wir mit Hilfe der SSL (wie in der Produktion), auch wenn es nicht läuft auf der hardware-Produktion.
InformationsquelleAutor spiffy
Eher als die Einstellung der Standard-socket-factory (die IMO ist eine schlechte Sache) - yhis nur Auswirkungen auf die aktuelle Verbindung, anstatt jedes SSL-Verbindung, die Sie versuchen, zu öffnen:
checkServerTrusted
implementiert nicht die erforderliche Logik, um tatsächlich das Zertifikat und sorgen nicht vertrauenswürdigen Zertifikaten wird abgelehnt. Dies könnte einige gute Lektüre: Die meisten gefährlichen code in the world: validating SSL certificates in non-browser software.Ihre
getAcceptedIssuers()
Methode entspricht nicht den Erweiterungsfunktionen, und diese "Lösung" bleibt radikal verunsichert.InformationsquelleAutor Jon Daniel
Vertrauen alle SSL-Zertifikate:-
Umgehen Sie SSL, wenn Sie wollen, um zu testen auf dem Testserver.
Aber verwenden Sie diesen code nicht für die Produktion.
}
Bitte rufen Sie diese Funktion in der onCreate () - Funktion in der Tätigkeit oder in Ihrer Anwendung Klasse.
Dies kann verwendet werden, für Volleyball in Android.
InformationsquelleAutor Ashish Saini
Wenn 'Sie' ein selbst signiertes Zertifikat, es ist bis zu Ihnen, um die Schritte, die erforderlich sind, um Ihre server nutzbar. Das heißt konkret: bietet Ihr Zertifikat, um Sie offline in einer vertrauenswürdigen Weise. So erhalten Sie zu tun. Anschließend importieren Sie diese in Ihre truststore verwenden das Dienstprogramm keytool, wie beschrieben in der JSSE Reference Guide. Denken Sie gar nicht über die unsichere TrustManager hier gepostet.
BEARBEITEN zugunsten der siebzehn (!) downvoters, und zahlreiche Kommentatoren unten, die haben eindeutig nicht wirklich gelesen was ich hier geschrieben habe, ist dies nicht eine jeremiad gegen self-signed-Zertifikate. Es ist nichts falsch mit selbst-signierten Zertifikaten wenn korrekt implementiert. Aber, der richtige Weg, um Sie zu implementieren ist, um das Zertifikat haben geliefert sicher über einen offline-Prozess,, anstatt über den nicht authentifizierten Kanal Sie gehen, um verwendet werden, um sich zu authentifizieren. Sicherlich ist dies offensichtlich? Es ist sicherlich offensichtlich für jeden sicherheitsbewussten Organisation, der ich jemals gearbeitet haben, von den Banken mit tausenden von Filialen an meinem eigenen Unternehmen. Der client-seitige code-base 'Lösung' zu Vertrauen alle Zertifikate, einschließlich selbst-signierte Zertifikate signiert von absolut niemandem, oder jedem beliebigen Körper die Einstellung sich selbst als ZERTIFIZIERUNGSSTELLE, ist ipso facto nicht sicher. Es ist einfach zu spielen auf Sicherheit. Es ist sinnlos. Sie haben eine private, manipulationssicher, reply-Nachweis -, Injektions-Beweis Gespräch mit ... jemand. Niemanden. Ein Mann in der Mitte. Ein Imitator. Niemanden. Sie kann genauso gut mit Klartext.
Ich bin überrascht, dass diese Antwort bekam downvoted so viel. Ich würde lieben, Sie zu verstehen, ein wenig mehr, warum. Wie es scheint, EJP ist, was darauf hindeutet, dass Sie nicht tun sollten option 2, weil es erlaubt, für eine große Sicherheitslücke. Könnte mir jemand erklären, warum (anders als pre-deployment-Einstellungen), warum diese Antwort ist von schlechter Qualität?
Gut, denke ich, alle. Was bedeutet "es ist bis zu Ihnen, um die Schritte, die erforderlich sind, um Ihre server nutzbar" bedeuten? Was macht ein server-Betreiber zu tun haben, nutzbar zu machen? Was sind die Schritte, die Sie im Sinn haben? Können Sie eine Liste von Ihnen? Aber ein Schritt zurück zu 1.000 Meter, wie funktioniert das sogar beziehen sich auf das problem des OP gefragt? Er will wissen, wie die client-akzeptieren Sie das selbstsignierte Zertifikat in Java. Das ist eine einfache Frage der übertragung Vertrauen in den code seit der OP findet das Zertifikat akzeptabel.
Korrigieren Sie mich, wenn ich falsch bin, aber die Annahme ein self-signed Zertifikat ist eine client-side-politische Entscheidung. Es hat nichts zu tun mit server-side-Operationen. Der client muss die Entscheidung treffen. Die Verhältnisse müssen gemeinsam an der Lösung arbeiten das key distribution problem, aber das hat nichts zu tun mit dem server nutzbar.
Ich habe das sicherlich nicht sagen, "Vertrauen allen Zertifikaten". Vielleicht bin ich etwas fehlt (oder Sie Lesen zu viel in die Dinge)... Der OP hat das Zertifikat, und seine von ihm angenommen. Er möchte wissen, wie Ihr zu Vertrauen. Ich bin wahrscheinlich Haarspalterei, aber das cert muss nicht geliefert werden offline. Eine out-of-band-Verifizierung verwendet werden sollte, aber das ist nicht das gleiche wie "muss geliefert werden, um die client offline". Er könnte sogar der shop die Herstellung der server und der client, so hat er die erforderliche a priori wissen.
InformationsquelleAutor user207421