Zertifikate in Java importieren

Möchte man mit Java auf einen Dienst zugreifen, der ein »selbst unterschriebenes« SSL Zertifikat (self signed certificate) nutzt, weist die SSL-Implementierung dies standardmäßig mit der Meldung »unable to find valid certification path to requested target« ab. Hier hat man nun zwei grundsätzliche Möglichkeiten:

SSL-Implementierung anpassen

Im Netz finden sich für die verschiedenen Implementierungen für die verschiedenen SSL-Clients, die entweder schlicht jedem Zertifikat vertrauen können oder bei denen sich dediziert festlegen lässt, welchen Zertifikaten vertraut werden soll. (vgl. zum Beispiel die EasySSLProtocolSocketFactory aus dem Jakarta Commons HttpClient-Projekt).

Oft kommt es aber auch vor, dass man die Implementierung gar nicht beeinflussen kann - z. B. wenn man mit Maven auf ein per HTTPS geschütztes Repository zugreifen möchte. Hier empfiehlt sich dann Plan-B:

Java das Zertifikat »unterschieben«

Java verfügt selber über einen Satz Stamm-Zertifikate, denen von vornherein vertraut wird. Gespeichert sind die Zertifikate in der Datei JAVA_HOME/jre/lib/security/cacerts, wobei es sich um einen einfachen Keystore des Typs »jks« mit dem Standard-Passwort »changeit« handelt. Mit dem keytool hat man nun eine einfache Möglichkeit, das Zertifikat, dem Vertrauen zu schenken ist, in eben diesen Keystore zu importieren:

JAVA_HOME/bin/keytool -import \
   -file certificate.pem \
   -keystore JAVA_HOME/jre/lib/security/cacerts
   -storetype jks

Das Tool fragt dann zunächst nach dem o. g. Passwort und möchte im nächsten Schritt nochmals ausdrücklich bestätigt haben, dass man diesem Zertifikat auch tatsächlich vertrauen möchte.