Wie verwende ich eine lokale HTTPS-URL in Java?

8

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.

%Vor%

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.

    
RodeoClown 17.12.2008, 02:48
quelle

6 Antworten

12

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%     
CornPuff 13.05.2009, 19:08
quelle
3

Sie müssen wahrscheinlich eine HostnameVerifier . Bevor Sie eine Verbindung herstellen, müssen Sie sie zum Verbindungsobjekt hinzufügen

%Vor%

Es gibt sicherlich einige Implementierungen, wenn Sie eine benötigen. Vielleicht möchten Sie sich auch das Projekt HttpClient ansehen.

    
sblundy 17.12.2008 03:00
quelle
3

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.

    
erickson 17.12.2008 07:06
quelle
0

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.

Aktualisiert

Hier 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%     
Charlie Martin 17.12.2008 02:56
quelle
0

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.

    
matt b 17.12.2008 14:43
quelle
0

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 ).

    
RodeoClown 17.12.2008 23:55
quelle

Tags und Links