"The thing that is in Room 101 is the worst thing in the world." - O'Brien in 1984
Samstag, 13. März 2010
Webserver mit SSL

Da meine Bedürfnisse an einen Webserver eher minimal sind, habe ich mich gegen den Apache und für lighttpd entschieden. Hinzu kommt der reduzierte Ressourcenbedarf von lighttpd, was ihn wesentlich attraktiver macht.

lighttpd installieren

Die Installation ist unter Debian gewohnt einfach

sudo aptitude install lighttpd
was folgende Pakete mitinstalliert
libfam0 libterm-readkey-perl libterm-readline-perl-perl

lighttpd konfigurieren

Um später die Weiterleitung nutzen zu können, aktivieren wir die Module rewrite und redirect in /etc/lighttpd/lighttpd.conf durch entfernen der Rautezeichen. Das ganze sieht dann wie folgt aus:

server.modules              = (
            "mod_access",
            "mod_alias",
            "mod_accesslog",
            "mod_compress",
            "mod_rewrite",
            "mod_redirect",
#           "mod_evhost",
#           "mod_usertrack",
#           "mod_rrdtool",
#           "mod_webdav",
#           "mod_expire",
#           "mod_flv_streaming",
#           "mod_evasive"
)

virtuellen Host einrichten

Lighttpd unterstützt mehrere (Sub-)Domains. Das ist besonders dann von Interesse, wenn man mehrere Webseiten auf einem Server betreiben will. Uns interessiert erst einmal nur der einfache Fall mit einer Domain. Dazu legen wir zunächst ein Verzeichnis an, welches später die Website beherbergen soll.

sudo mkdir -p /var/www/example/www
sudo chown www-data:www-data /var/www/example/www/
Danach hängen wir folgende Zeilen an /etc/lighttpd/lighttpd.conf an:
$HTTP["host"] =~ "^(www\.)?example\.com$" {
        server.document-root = "/var/www/example/www"
}
Der reguläre Ausdruck sorgt dafür, dass unsere Webseite sowohl mit als auch ohne Prefix www erreichbar ist. Anschließend starten wir lighttpd neu.
sudo invoke-rc.d lighttpd restart

SSL

Um später auch Passwörter vernünftig übertragen zu können bietet sich eine verschlüsselte Kommunikation mit SSL an. Dazu benötigt der Server ein signiertes Zertifikat. Die Erzeugung eines solchen ist leider etwas aufwändiger. Doch bevor wir loslegen, muss, falls nicht vorhanden, openssl installiert werden

sudo aptitude install openssl
und ein Schlüsselpaar erstellt werden.
openssl genrsa -out example.com.key 2048

Um ein Certificate Signing Request (CSR) zu erstellen, nutzen wir den (soeben) erstellten (öffentlichen) Schlüssel

openssl req -new -key example.com.key -out example.com.csr
Als Common Name (CN) geben wir die Adresse des Servers an für den das Zertifikat ausgestellt werden soll, für unser Beipiel also www.example.com.

Da selbstsignierte Zertifikate immer zu Fehler- /Warnmeldungen im Browser führen, bietet sich StartSSL an. Deren Wurzelzertifikat ist in den gängigen Browsern bereits installiert und für unsere Zwecke (Zertifikat für einen Webserver ohne Subdomains) ist der Dienst kostenlos. Beginnend mit dem Punkt "Express Lane" erzeugen wir zunächst ein SSL-Clientzertifikat für die Authentifizierung bei StartSSL und anschließend das SSL-Serverzertifikat. Als Domain geben wir nur example.com an, der Prefix wwww wird automatisch ergänzt. Die Generierung des Schlüsselpaares für das Serverzertifikat sollte man überspringen und das eigene zuvor erstellte verwenden. Das fertige Serverzertifikat wird uns als Base64-codierter Text präsentiert, den wir unter example.com.crt abspeichern.

Da lighttpd nur Zertifikate im PEM-Format unterstützt, müssen wir das CRT-Zertifikat vorher konvertieren. Dies geschieht einfach durch Hinzunahme unseres Schlüssels mittels

cat example.com.crt example.com.key > example.com.pem
Jetzt kopieren wir das Zertifikat noch an die richtige Stelle, bspw. /etc/lighttpd/ssl
sudo mkdir /etc/lighttpd/ssl
sudo cp example.com.pem /etc/lighttpd/ssl/
sudo chmod 400 /etc/lighttpd/ssl/example.com.pem

Für einen reibungslosen betrieb muss der Webserver das Intermediate-Zertifikat (IM) von StartSSL ausliefern, mit dem unser SSL-Serverzertifikat unterschrieben wurde. Dazu laden wir zunächst die benötigten Zertifikate herunter, vereinen diese und speichern sie ebenfalls unter /etc/lighttpd/ssl ab.

wget -c https://www.startssl.com/certs/sub.class1.server.ca.pem
wget -c https://www.startssl.com/certs/ca.pem
cat ca.pem sub.class1.server.ca.pem > ca-certs.crt
sudo cp ca-certs.crt /etc/lighttpd/ssl/
sudo chmod 400 /etc/lighttpd/ssl/ca-certs.crt
Nun bleibt uns nur noch SSL in lighttpd zu aktivieren. Dazu editieren wir die Datei /etc/lighttpd/lighttpd.conf und ergänzen vor dem virtuellen Host folgende Zeilen:
## redirect all hosts to their secure equivalents
$SERVER["socket"] == ":80" {
        $HTTP["host"] =~ "(.*)" {
                url.redirect = ( "^/(.*)" => "https://%1/$1" )
        }
}

## enable ssl
$SERVER["socket"] == ":443" {
        ssl.engine = "enable"
        ssl.ca-file = "/etc/lighttpd/ssl/ca-certs.crt"
        ssl.pemfile = "/etc/lighttpd/ssl/example.com.pem"
}

Permalink