SSL mit JBoss

Aus HackerWiki

Contents

Vorwort

Da ich bisher kein brauchbares Howto gefunden habe, in dem erklärt wird, wie man SSL mit dem JBoss Application Server nutzt, habe ich beschlossen hier eines zu schreiben. Keines der mir bekannten Howtos erklärt fehlerfrei, wie man ein von einer offiziellen Zertifizierungsstelle signiertes Zertifikat im JBoss AS nutzt. Alle mir bekannten führten in dem Moment zu Fehlern, wenn im $JAVA_HOME/jre/lib/security/cacerts das Root-Zertifikat des Issuers nicht vorhanden war, wie es z.B. bei Trustcenter der Fall ist. Voraussetzung für dieses Howto ist ein funktionierender JBoss AS mit installiertem Java-EE-JDK.

Erstellen eines Keystore

Zuerst einmal benötigen wir einen Keystore, aus dem der JBoss AS sein Zertifikat und den private Key nutzen kann. Diesen erstellen wir mit

keytool -genkey -alias <meine.domain.de> -keyalg RSA -keystore ./meinserver.keystore

Der String '<meine.domain.de>' sollte durch den Domainnamen ersetzt werden, der später für die SSL-Verbindungen genutzt werden soll (z.B. ssl.hackerwiki.org). Dieser Befehl fragt ein paar Daten für das Zertifikat ab, wo wir folgende Daten angeben:

Enter keystore password:  (das hier eingegebene Passwort brauchen wir in Zukunft für den Zugriff auf den Keystore)
What is your first and last name?
  [Unknown]:  (Hier die Domain eintragen, die für die SSL-Verbindungen genutzt werden soll, z.B. ssl.hackerwiki.org)
What is the name of your organizational unit?
  [Unknown]:  (Hier geben wir die Abteilung der Firma ein, z.B. Systemadministration)
What is the name of your organization?
  [Unknown]:  (Hier kommt der Name der Firma hin, der im Zertifikat genutzt werden soll, z.B. HackerWiki)
What is the name of your City or Locality?
  [Unknown]:  (Die Stadt, in der die Firma ihren Sitz hat, z.B. Potsdam)
What is the name of your State or Province?
  [Unknown]:  (Das Bundesland, in dem sich die Stadt befindet, z.B. Brandenburg)
What is the two-letter country code for this unit?
  [Unknown]:  (Das Land, in dem sich die Stadt befindet, z.B. DE für Deutschland)
Is CN=ssl.hackerwiki.org, OU=Administration, O=HackerWiki, L=Potsdam, ST=Brandenburg, C=DE correct?
  [no]:  yes

Enter key password for <meine.domain.de>
        (RETURN if same as keystore password): (Hier leer lassen)

Erstellen des CSR

Nun erstellen wir uns aus unserem Keystore ein Certificate Request, den wir dann entweder selbst signieren oder aber offiziell von einer anerkannten Zertifizierungsstelle signieren lassen können.

keytool -certreq -keystore ./meinserver.keystore -alias <meine.domain.de> -file meinserver.csr

Auch hier muss wieder das Alias, das wir beim Erstellen des Keystore genutzt haben, anstelle von '<meine.domain.de>' eingesetzt werden.

Signieren des CSR

Wir haben nun 2 Möglichkeiten um ein gültiges Zertifikat für unseren Keystore zu erhalten. Um ein Zertifikat zu bekommen, das von den Browsern auch ohne Fehlermeldung akzeptiert wird, müssen wir die CSR von einer offiziellen Zertifizierungsstelle (z.B. TrustCenter) signieren lassen. Ist eine hohe Sicherheit nicht so wichtig, oder handelt es sich um einen Testserver, können wir uns selbst ein Zertifikat aus dem CSR erstellen. Allerdings fragt der Browser bei einem Verbindungsaufbau dann immer nach, ob das Zertifikat akzeptiert werden soll. Für private Zwecke sollte das aber kein Problem darstellen. Wie man aus einem CSR ein eigenes Zertifikat erstellt, kann diversen Anleitungen zu openssl entnommen werden. Im folgenden gehe ich aber davon aus, dass ein offiziell signiertes Zertifikat verwendet werden soll.

Einspielen des signierten Zertifikats in den Keystore

Wir bekommen nun von der Zertifizierungsstelle ein gültiges Server-Zertifikat, aber wenn die Zertifizierungsstelle nicht in $JAVA_HOME/jre/lib/security/cacerts eingetragen ist, können wir es nicht in den Keystore importieren. Wir erhalten dann die Meldung:

keytool error: java.lang.Exception: Failed to establish chain from reply

Wir benötigen erst das Root-Zertifikat der Zertifizierungsstelle im PEM-Format. Dieses bekommt man meist auf der Homepage des Anbieters. Wir downloaden es und speichern es in rootcert.pem. Dieses Zertifikat importieren wir jetzt mit dem Alias 'root' in unseren Keystore

keytool -import -trustcacerts -file rootcert.pem -keystore meinserver.keystore -alias root

Nun können wir unser Zertifikat importieren. Ich gehe hier davon aus, dass es in der Datei meinserver.crt abgespeichert wurde, die sich in unserem Arbeitsordner befinden sollte.

keytool -import -trustcacerts -file meinserver.crt -keystore meinserver.keystore -alias <meine.domain.de>

Auch hier '<meine.domain.de>' wieder entsprechend wie oben ersetzen. Zum Schluss müssen wir nur noch das Root-Zertifikat wieder aus dem Keystore entfernen

keytool -delete -keystore name.keystore -alias root

Konfigurieren der Tomcat-Engine im JBoss

Nun haben wir einen Keystore mit einem gültigen Zertifikat. Wir müssen jetzt nur noch den SSL-Connector für die Tomcat-Engine im JBoss konfigurieren. Dazu bearbeiten wir die Datei '<JBoss-Installations-Ordner>/server/default/deploy/jbossweb-tomcat50.sar/server.xml' und fügen folgenden Abschnitt ein:

      <Connector port="8443" address="${jboss.bind.address}"
           maxThreads="100" minSpareThreads="5" maxSpareThreads="15"
           scheme="https" secure="true" clientAuth="false"
           keystoreFile="${jboss.server.home.dir}/conf/ssl/meinserver.keystore"
           keystorePass="meinkeystorepasswort" sslProtocol = "TLS" />

Anstelle von 'meinkeystorepasswort' setzen wir das Passwort ein, das wir beim Erstellen des Keystore angegeben haben. Zum Schluss kopieren wir noch den Keystore an die richtige Stelle

mkdir <JBoss-Installations-Ordner>/server/default/conf/ssl
cp meinserver.keystore <JBoss-Installations-Ordner>/server/default/conf/ssl/

und starten den Server neu. Danach sollten wir auf Port 8443 eine HTTPS-Verbindung aufbauen können.

Bitmuncher 17:15, 20. Feb 2007 (CET)

Persönliche Werkzeuge