Allgemeines
Um aus einem Java-Programm (z.B. aus einem Tomcat oder jboss o.ä.) auf eine durch ssl gesicherte Verbindung zugreifen möchte muss das Zertifikat des Zielservers im sogenannten JAVA keystore speichern.
Während der Speicherung muss dann auch angegeben werden, ob man diesem Zertifikat vertraut.
Selbstverständlich laufen diese Zertifkate irgendwann ab und man muss rechtzeitig vorher ein neues Zertifikat installieren und auch alle JAVA-Keystores entsprechend mit dem neuen Zertifikat aktualisieren.
Das Ganze ist eine Sicherheitsfunktion.
Sollte ein Angreifer durch Manipulation den Zielserver übernehmen und das Zertifikat ändern, oder eine sogenannte "Man-in-the-Middle"-Attack vorliegen wird das Zertifikat abgelehnt.
Von einer Man-in-the-Middle-Attack spricht man, wenn sich zwischen dem Client und dem Server ein weiterer Server einschaltet der vorgibt der Zielserver zu sein.
Wie kann ich das Zertifkat des Zielservers bekommen und speichern
Das Zertifikat kann mit dem folgenden Befehl erstellen:
openssl s_client -connect ZIELADRESSE:PORT
Zieladresse ist die IP-Adresse bzw. DNS-Name des Zielservers
Port ist der Zielport zu dem die Verbindung aufgebaut werden soll.
Beispiel: Bei Webservern ist der typische SSL-Port 443
Nach Ausführung des Befehls werden umfangreiche Infos über das Zielsystem angezeigt.
Alle Informationen zwischen "BEGIN CERTIFICATE" und "END CERTIFICATE" speichern sie bitte in einer Datei, z.B. "ZERTIFIKAT.cert"
----BEGIN CERTIFICATE---- IBAgIJAIVPnV704vaUMA0GCSqGSIb3DQEBBQUAMIG1MQswCQYD ... 3sUCfp4HJNQK3+qOsMmgt2X1NbBf0EXSi51CN/IgSdzhEYH+mH ----END CERTIFICATE----
Wo finde ich den JAVA Keystore
Die JAVA-Installation enthält ein Unterverzeichnis mit Namen "jre", darunter gibt es einen Ordner mit Namen "lib", darunter der Ordner "security".
In diesem Ordner ist eine Datei mit Namen cacerts.
Diese Datei enthält den default JAVA keystore. (Das standard-Kennwort dazu ist "changeit")
Selbstverständlich wäre es auch möglich für jede Anwendung einen eigenen keystore zu erstellen. (Anwendungsdesign ??)
In unserem Beispiel kann man den Inhalt des JAVA-keystore wie folgt anzeigen.
root@lemaker:~# export JAVA_HOME=/opt/java root@lemaker:~# export PATH=$JAVA_HOME/bin:$PATH root@lemaker:~# type java java is /opt/java/bin/java root@lemaker:~# cd $JAVA_HOME/jre/lib/security root@lemaker:/opt/java/jre/lib/security# ls -la cacerts -rw-r--r-- 1 uucp 143 101768 Jun 16 18:36 cacerts root@lemaker:/opt/java/jre/lib/security# #Zertifikate anzeigen root@lemaker:/opt/java/jre/lib/security# keytool -list -keystore cacerts Keystore-Kennwort eingeben: Keystore-Typ: JKS Keystore-Provider: SUN Keystore enthält 95 Einträge .... LISTE der Zertifikate ....
Import eines Zertifikats
keytool -import -alias ALIASNAME -file ZERTIFIKAT.cert -keystore cacerts
Bitte beachten, dass die Angabe "-alias" nicht zwingend ist.
Ohne diese Angabe ist der Name des Zertifikats "mykey"
Empfohlen wird aber, dass der alias identisch ist mit dem Namen des Zielsystems.