Beispiel für HTTPS Request?

Hallo!

Ich möchte einen einfachen HTTPS-WebRequest machen. Allerdings gibt es bei der Verbindung zur Webseite einen Haufen Exceptions, die darauf hinweisen, dass das Zertifikat nicht verarbeitet werden kann. Via Internetrecherche habe ich erfahren, dass eine einfach URLConnection eh nicht für eine secure-Verbindung ausgelegt ist.
Kann mir jemand erklären, welche Klassen/ Bibliotheken ich benötige oder hat jemand ein gutes Tutorial parat?

Vielen Dank!

Hallo!

Ich möchte einen einfachen HTTPS-WebRequest machen. Allerdings
gibt es bei der Verbindung zur Webseite einen Haufen
Exceptions, die darauf hinweisen, dass das Zertifikat nicht
verarbeitet werden kann.

Handelt es sich um ein selbstsigniertes Zertifikat?

Via Internetrecherche habe ich
erfahren, dass eine einfach URLConnection eh nicht für eine
secure-Verbindung ausgelegt ist.

 URL url = new URL("https://www.gmx.net");
 BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
 String line = null;
 while((line = reader.readLine()) != null)
 {
 System.out.println(line);
 }
 reader.close();

Funktioniert bei mir einwandfrei. Falls es sich um ein selbst-, oder durch ein nicht bekanntes CA signiertes Zertifikat handelt, sollte es funktionierten, wenn das CA Zertifikat in den Java Keystore importiert wird.

Gruß
Heavy

Hallo.

Ich möchte einen einfachen HTTPS-WebRequest machen. Allerdings
gibt es bei der Verbindung zur Webseite einen Haufen
Exceptions, die darauf hinweisen, dass das Zertifikat nicht
verarbeitet werden kann.

Kann mir jemand erklären, welche Klassen/ Bibliotheken ich
benötige oder hat jemand ein gutes Tutorial parat?

Es sind vor allem 2 Arten von Problemen, die gerade
bei selbst erstellten SSL-Zertifikaten, die nicht von
einer offziellen Zertifizierungsstelle wie Versign
beglaubigt wurden, Probleme bereiten:

(a) selbst-signierte Zertifikate

Java erlaubt standardmäßig keine Nutzung
selbst-signierter Zertifikate, wie sie in
Testumgebungen üblicherweise eingesetzt werden,
sondern wirft eine SSLException.

(b) Rechnernamen ungleich Zertifikatsname

Eine Exception wird auch erzeugt, wenn der
Name im SSL-Zertifikat nicht hundertprozentig
mit dem verbundenen Servernamen übereinstimmt.

Die Verbindung zu https://localhost wirft also
eine Exception, wenn das Zertifikat für
mein.testrechner.de“ ausgestellt wurde.

Um das Verhalten auf diese Problemfälle selbst
zu steuern, müssen 2 Klassen implementiert
und registriert werden, die folgende Interfaces
implementieren:

  • javax.net.ssl.HostnameVerifier

  • javax.net.ssl.X509TrustManager

Hier ein Code-Schnippsel zum Einstieg:

 // (a) custom reaction to (self-signed) certificates:

 // TODO: create customTrustManager by implementing javax.net.ssl.X509TrustManager interface:
 TrustManager[] arrCustomTrustManager = new TrustManager[] { customTrustManager };
 SSLContext customSSLContext = SSLContext.getInstance("SSL");

 // because we do not do client authentication, we do not need a KeyManager:
 customSSLContext.init(null, arrCustomTrustManager, new SecureRandom());

 SSLSocketFactory sslSocketFactory = customSSLContext.getSocketFactory();
 HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory);

 // (b) custom reaction to hostname mismatches:

 // TODO: create customHostnameVerifier by implementing javax.net.ssl.HostnameVerifier:
 HttpsURLConnection.setDefaultHostnameVerifier(customHostnameVerifier);

Gruß,
-Andreas.