SSL Zertifikat für Tomcat erzeugen#

Wenn man Tomcat als Webserver nutzt, kann man einen HTTPS-Listener konfigurieren und so über SSL verschlüsselte Verbindungen nutzen.

Mit einigen Einträgen in web.xml kann man auch dafür sorgen, daß eine Authentifizierung vorgeschrieben ist. Die Benutzerdatenbank steht in /var/lib/tomcat4/conf/tomcat-users.xml. Wer eine vernünftige Sicherheit haben will, sollte über eine Basic-Authentication (oder Formular-Auth.) hinaus nur noch SSL-Verbindungen annehmen.

Folgender Eintrag gehört dazu in /etc/tomcat4/server.xml. Eigentlich sollte der laut Doku dort auskommentiert schon stehen, tat er aber in meiner Debian-Installation nicht.

Beispiel 1#

  <Connector port="8443"
      maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
      enableLookups="false" disableUploadTimeout="true"
      acceptCount="100" scheme="https" secure="true"
      clientAuth="true" sslProtocol="TLS"
      keystoreFile="/usr/share/tomcat4/.keystore" keystorePass="changeit" />

Beispiel 2#

  
  <!-- Define an SSL HTTP/1.1 Connector on port 8443 -->
  <Connector className="org.apache.catalina.connector.http.HttpConnector"
           port="8443" minProcessors="5" maxProcessors="75"
           enableLookups="true"
           acceptCount="10" debug="0" scheme="https" secure="true">
      <Factory className="org.apache.catalina.net.SSLServerSocketFactory"
               clientAuth="false" protocol="TLS"/>
  </Connector>

Keine "weiche" Verschlüsselung#

Um das veraltete SSLv2 und zu "weiche" Verschlüsselungsalgorithmen zu vermeiden, gebe die Protokolle und Ciphers explizit an, zum Beispiel:

  
    sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, 
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, 
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA, 
    TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256, 
    TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA"

Schlüssel erzeugen#

In der Java-Welt benutzt man für die Verwaltung von SSL-Zertifikaten das "keytool", das man im "bin"-Verzeichnis des Java-SDK findet.

Gerade unter Debian Linux ist es wichtig, daß man sich immer im klaren darüber ist, mit welchem Java man gerade arbeitet. Debian installiert gerne gcj für alles mögliche, während ich persönlich das Java von Sun bevorzuge. Mit update-java-alternatives -l bekommt man eine Liste der installierten VMs und mit sowas wie

  update-java-alternatives -s java-1.5.0-sun

stellt man die Standard-VM ein. Dies erkläre ich an dieser Stelle, weil die Keytools inkompatibel sind und ich mit dem keytool vom gcj im Tomcat nichts erreicht habe.

Um das nötige Zertifikat zu erzeugen und zu signieren bin ich folgendermaßen vorgegangen:

1. Key erzeugen mit:

  keytool -genkey -keyalg RSA -keysize 2048 -keystore /usr/share/tomcat4/.keystore -alias tomcat

Hier genügt es, im Namensfeld "common name" (auf die Frage "What is your first and last name?") den Domainnamen anzugeben, also z.B. "ssl.example.org". Alle anderen Felder werden von CaCert nicht zertifiziert, weil CaCert die Angaben nicht prüfen kann. Bei einem kostenpflichtigen Zertifikat, z.B. von Verisign, sollten die Angaben natürlich vollständig sein und zertifiziert werden.

2. Einen Zertifikat-Request für die CA exportieren mit:

  keytool -certreq -keystore /usr/share/tomcat4/.keystore -alias tomcat -file keyrequest.csr

3. Das Zertifikat signieren. Bei CaCert kann man Zertifikate kostenlos signieren lassen. Nachteil: Das Root-Zertifikat von CaCert ist bisher nicht in den Browsern hinterlegt. Daher muss ich die Root-Zertifikate von CaCert in meinen Keystore importieren:

  wget http://www.cacert.org/certs/root.crt
  wget http://www.cacert.org/certs/class3.crt
  keytool -import -keystore /usr/share/tomcat4/.keystore -alias cacertclass1ca -import -trustcacerts -file root.crt
  keytool -import -keystore /usr/share/tomcat4/.keystore -alias cacertclass3ca -import -trustcacerts -file class3.crt

4. Import des signierten SSL-Zertifikats: Ich speichere das Zertifikat in einer Datei "cert.pem".

  keytool -import -keystore /usr/share/tomcat4/.keystore -v -trustcacerts -alias tomcat -file cert.pem

Das war's schon.

Alternativ kann man natürlich auch mit einem selbstzertifizierten SSL-Key arbeiten. Dazu fallen die Punkte 2. bis 4. weg. Stattdessen ruft man auf:

  keytool -selfcert -keystore /usr/share/tomcat4/.keystore -alias tomcat

Alternativ#

kurz-und-bündig-Lösung von Thomas:

    keytool -genkey -alias tomcat -keyalg RSA
    mv /root/.keystore /usr/share/tomcat4/
    chown tomcat4 /usr/share/tomcat4/.keystore
    chmod u+r  /usr/share/tomcat4/.keystore
    chmod go-rw  /usr/share/tomcat4/.keystore

Danach gibt es einen SSL-Zugang zum Tomcat auf Port 8443 (also am besten mal mit https://hostname:8443/ probieren).

Mit weiteren Einträgen in der web.xml kann man nun auch dafür sorgen, daß unsere Web-Applikation nur noch SSL-Verbindungen annimmt. Natürlich kann man auch die nicht-SSL-Connectoren aus der server.xml entfernen, was dann für alle Tomcat-Appliaktionen gilt. Damit hat man die optimale SSL-Sicherheit.

Client Authentifizierung#

Weiterhin können sich auch Clients über ein SSL-Zertifikat beim Server authentifizieren.

Genaueres dazu findet sich bei entwickler.de: http://www.entwickler.de/zonen/portale/psecom,id,101,online,832,p,0.html

-- PeterHormanns und ThomasBayen


Tags:  Tomcat, SSL, Java, CaCert, Crypto

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-19) was last changed on 14-Aug-2015 12:53 by Peter Hormanns