In vielen Fällen kann es zu Problemen kommen, wenn man mit Java eine SSL-Verbindung aufbauen will. Dies kann etwa dann zum Tragen kommen, wenn man aus einem Jenkins-CI Server Artefakte in ein Sonatype Nexus Repository laden will, welches per HTTPS (und damit SSL) abgesichert ist.
Der Grund dafür ist, dass Java SSL-Zertifikate aus einem so genannten „Java Keystore“ verwendet. Ist in diesem Keystore das passenden Zertifikat nicht hinterlegt, so bekommt man Fehlermeldungen wie „SSL handshake alert: unrecognized name“ oder“PKIX path building failed“.
Um diese Probleme in den Griff zu bekommen, kann man das SSL-Zertifikat des Zielhosts am Client im Default Java-Keystore (dieser ist im JRE-Installationsverzeichnis im Unterverzeichnis lib/security zu finden) hinterlegen. Dazu lädt man sich zuerst das Zertifikat (per Browser oder ähnlichem) im CER-Format auf den eigenen Rechner. Dieses speichert man etwa als „/myFolder/serverCertificate.cer“ ab.
Nun führt man folgendes Kommando aus:
keytool -import -alias myServer -file /myFolder/serverCertificate.cer -keystore /opt/jdk/jre/lib/security/cacerts
Daraufhin muss man das Passwort des Keystores eingeben (das Anfangspasswort ist „changeit“) und die Aufnahme des Zertifikates in den Keystore bestätigen.
Damit sollten die Probleme mit den SSL-Warnungen verschwunden sein.
EDIT:
Verwendet man letsencrypt, dann kann man die Zertifikate wie folgt im keystore hinzufügen/updaten (Die Domain und das Passwort müssen angepasst werden):
Ein schon vorhandener Eintrag muss gelöscht werden (bei einem Update):
Das Eintragen in den Keystore erfolgt mit folgendem Befehl:
Ein Tool, mit dem man ein Zertifikat eines Webservers (welches dieser per HTTPS zur Verügung stellt) in einen Java-Keystore importieren kann, gibt’s bei github: https://github.com/ssbarnea/keytool-trust
Das keytool-trust Werkzeug macht bei mir momentan mit letsencrypt Zertifikaten ein paar Probleme. Das Tool schreibt zwar, dass ein Zertifikat importiert wurde (und im Keystore ist das auch ersichtlich), aber ich kann per Java dann trotzdem keinen Handshake durchführen.
Die Lösung ist der Import in den Keystore „per Hand“ mit den folgenden Befehlen:
Ein tolles Tool zum Bearbeiten von Java-Keystores ist „Portecle“.
Damit lassen sich bspw. SSL-Verbindungen untersuchen und die beteiligten Zertifikate importieren.