!!!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

!!Links
*vergleiche auch unsere Seite zu OpenSSL
*[http://nodsw.com/blog/leeland/2006/12/06-no-more-unable-find-valid-certification-path-requested-target] Java Programm, um ein selbstsigniertes Zertifikat in den Keystore der Java-Runtime zu importieren, nötig für SSL-Clients in Java
*[http://tvilda.stilius.net/java/java_ssl.php] SSL Tutorial für Java-Programmierer
*[http://shib.kuleuven.be/docs/ssl_commands.shtml] Wichtige Kommandos für SSL-Zertifikate
*[http://juliusdavies.ca/commons-ssl/] Java-SSL-Bibliothek
*[http://portecle.sourceforge.net/] Grafische Oberfläche für das Java-Keytool

-- PeterHormanns und ThomasBayen

\\
[{Tag Tomcat SSL Java CaCert Crypto}]