SSL-Zertifikate und Java Clients

SSL und somit auch https nutzen eine asysmetrische Verschlüsselung, d.h. der Client benötigt den öffentlichen Schlüssel des Servers, mit dem er die Nachricht für diesen verschlüsseln kann.

Um mit einem Java-WebService-Client eine SSL Verbindung herzustellen, muss das Zertifikat des Servers in den JVM Keystore importiert werden. Man kann es entweder in den Standardkeystore importieren, der je nach Betriebssystem an verschiedenen Orten liegen kann. Bei Windows liegt er normalerweise hier:

C:\Dokumente und Einstellungen\<user>\.keystore

Um einen Zertifikat und somit einen Schlüssel in diese Datei zu importieren, kann man das Keytool von SUN nutzen, welches unter %JAVA_HOME%\bin\keytool.exe zu finden ist. Ein Import eines Zertifikates sieht folgendermaßen aus:

keytool -import -v -alias <keyalias – frei wählbar> -file <Speicherort des Zertifikats> -storepass <standard:changeit>

Leider scheint Tomcat warum auch immer partout nicht auf diese Datei zuzugreifen, also habe ich eine eigene Datei mit dem zusätzlichen Parameter -keystore <datei.keystore> erstellt.

Nun musste ich auch noch beim Initialisieren meines Servlet, welches den WebService über https aufruft das System-Property javax.net.ssl.trustStore setzen:

System.setProperty(„javax.net.ssl.trustStore“, „datei.keystore“);

Für den Client MUSS es das trustStore-Property sein und NICHT das keyStore-Property.

Das ganze kann man natürlich auch Tomcat als Startparameter mit übergeben, wie hier beschrieben.

Update: Der java-weite Keystore liegt in JAVA_HOME\jre\lib\security\cacerts

Advertisements

  1. pastafan

    Danke! Endlich eine Lösung für mein Problem. Und so einfach beschrieben! Ich habe gestern alles durchwühlt und nichts gefunden, was mir wirklich geholfen hat. Heute frohen Mutes noch mal gesucht und hier die Lösung gefunden! Kurz – bündig – hilfreich!

    • Wotan

      Bei mir funktioniert es irgendwie nicht, ich möchte mit

      System.setProperty(„javax.net.ssl.trustStore“, „infor.jks“);

      das property in der init()-Funktion des Servlets setzen, allerdings erhalte ich beim handshake des SSL-Socket-Aufbaus die Fehlermeldung: „the trustAnchors parameter must be non-empty“, was wohl eigentlich heißt, dass er den keystore nicht gefunden hat. Ich habe es mit absolutem Pfad und einfacher Dateinamenangabe versucht. Wo müsste denn der keystore in einem Servlet abgelegt werden?




Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s



%d Bloggern gefällt das: