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>
In der Java-Welt benutzt man für die Verwaltung von SSL-Zertifikaten das "keytool", das man im "bin"-Verzeichnis des Java-SDK findet.
Um das nötige Zertifikat zu erzeugen und zu signieren bin ich folgendermaßen vorgegangen:
1. Key erzeugen mit:
keytool -genkey -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 http://cacert.org
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-- PeterHormanns und ThomasBayen