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