Mit der Java-URL-Klasse kann ich eine Verbindung zu einem externen HTTPS
-Server (wie unserer Produktionsstätte) herstellen, aber mit einer lokalen URL bekomme ich die folgende Ausnahme.
Wie bekomme ich einen gültigen Zertifizierungspfad?
BEARBEITEN: Ich verwende diese URL nicht, um direkt eine Verbindung zu erstellen. Ich übergebe die URL an eine itext
PDFReader
, die dann das Verbindungsproblem hat.
Hier war meine Lösung, die einige der Ideen in diesem Thread enthält und zusammen mit Code aus dem Netz pikante. Alles, was ich diese Funktion aufrufen, und es setzt den Standard-Trust-Manager und HostName Verifier für HttpsURLConnection. Dies könnte für einige nicht wünschenswert sein, da es alle HttpsURLConnections betrifft, aber ich schreibe nur einen einfachen Proxy, so dass es für mich funktioniert.
%Vor% Sie müssen wahrscheinlich eine HostnameVerifier
. Bevor Sie eine Verbindung herstellen, müssen Sie sie zum Verbindungsobjekt hinzufügen
Es gibt sicherlich einige Implementierungen, wenn Sie eine benötigen. Vielleicht möchten Sie sich auch das Projekt HttpClient ansehen.
Eine andere Sache, die Sie sich ansehen sollten, ist die TrustManager
, die Sie verwenden. Die Fehlermeldung weist darauf hin, dass das vom Server vorgelegte Zertifikat nicht von einem vertrauenswürdigen Root signiert wurde. Da Sie keine direkte Kontrolle über den SSL-Socket haben, der erstellt wird, denke ich, dass Ihre beste Wette ist, initialisieren Ihre eigene SSLContext
mit einem TrustManager
das war Setup mit der Stammzertifizierungsstelle CA der Zertifikatskette des Servers." Setzen Sie dann diesen Kontext als Standard .
Dies setzt voraus, dass Sie Java 6 verwenden. Die API ist in Java 5 eingeschränkter. Sie können den Standardwert SSLSocketFactory
erhalten, aber es gibt keine Standardmethode zum Einstellen.
Das Problem, über das Sie sich beschweren, ist, dass der Server beim Erstellen einer SSL-Verbindung dem Client ein gültiges Zertifikat vorlegen muss. Sie können einen geeigneten Endpunkt in Java schreiben (HTTPServerSocket wird es tun, denke ich), aber es würde etwas Hacking benötigen, um es einzurichten. Es ist wahrscheinlich einfacher, einen lokalen Webserver mit allem einzurichten, was SSL korrekt behandelt - Apache, lighttp, was auch immer --- und ein selbstsigniertes Zertifikat mit den openssl-Tools erstellt.
AktualisiertHier ist ein Beispiel aus dem Java-Almanach. Ссылка
Ein SSL-Server-Socket benötigt Zertifikate, die an Clients zur Authentifizierung gesendet werden. Die Zertifikate müssen in einem Schlüsselspeicher enthalten sein, dessen Speicherort explizit angegeben werden muss (es gibt keinen Standardwert). Im folgenden Beispiel wird beschrieben, wie ein Keystore für den SSL-Server-Socket erstellt und angegeben wird.
%Vor%Geben Sie den Schlüsselspeicher der Zertifikate mit der Systemeigenschaft javax.net.ssl.keyStore an:
%Vor%Es kann Ihnen auch helfen, das Zertifikat, das der localhost-Server verwendet (ich nehme an, es ist selbstsigniert), dem Keystore der JVM hinzuzufügen , mit dem Dienstprogramm "keytool" . Dies sollte der JVM mitteilen, dass Sie diesem Zertifikat vertrauen können.
Ich habe eine statische Methode (nur für dev) ausgeführt, die einen sehr vertrauenswürdigen TrustManager installiert (akzeptiert alles), und auch einen HostnameVerifier, der immer true zurückgibt (danke sblundy ).
Tags und Links java https certificate