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