Dezember 2013: SSL-Zertifikate im Webserver

Autoren: Michael Gisbers und Christian Hesse

Mit den letzten Artikeln dieser Reihe haben wir mit `openssl` Zertifikate erzeugt und überprüft. In diesem Artikel konfigurieren wir unsere Webserver, um mit den Zertifikaten unsere Webseiten abzusichern.

Apache HTTP Server

Einer der bekanntesten Webserver ist der Apache HTTPD. Bei den meisten Installationen ist von Haus aus schon eine Konfiguration für SSL eingebunden, und es müssen nur noch der Schlüssel (`server.key`) und das bereits erzeugte Zertifikat (`server.crt`) ausgetauscht werden. Wir gehen in der Folge davon aus, dass wir nur einen Eintrag für einen nicht abgesicherten `VirtualHost` haben, und kopieren uns den Bereich `<VirtualHost *:80>` bis `</VirtualHost>`, um ihn als Basis für unsere Konfiguration zu nutzen.

Für unser Beispiel gehen wir von folgendem Bereich aus:

Nach dem Kopieren dieses Bereiches passen wir ihn für SSL an. Zunächst ist der Port von `80` auf den Standard-Port `443` zu ändern. Damit der Apache HTTP Server auch auf diesem Port horcht, muss vor dem `<VirtualHost>` mit der Zeile `Listen 443` eine entsprechende Anweisung hinterlegt sein.

Innerhalb des `<VirtualHost>` fehlen nun noch die Parameter für Aktivierung und Konfiguration des SSL. Nach der Konfiguration sieht unser Block wie folgt aus:

Die Direktive `SSLEngine` legt fest, ob dieser Virtual Host mit SSL arbeitet oder nicht. Über die `SSLCipherSuite` werden die Verschlüsselungsoptionen freigegeben oder eingeschränkt. Die folgenden zwei Direktiven (`SSLCertificateFile` und `SSLCertificateKeyFile`) erklären sich mit den übergebenen Dateinamen von selbst. Nur die letzte Direktive ist ungewöhnlich.

Wie wir bereits im ersten Teil dieser Artikelserie erfahren haben, gibt es bei den Zertifikaten eine hierarchische Struktur. Es gibt ein Root-Zertifikat, aus dem die weiteren Zertifikate generiert werden. Da die Betriebssysteme und Browser immer nur das Root-Zertifikat kennen, müssen alle Zertifikate, die zwischen dem eigenen Zertifikat und dem Root-Zertifikat liegen, in der über die Direktive `SSLCertificateChainFile` angegebenen Datei hinterlegt werden.

Es darf allerdings 'nicht' das Root-Zertifikat mit hinterlegt werden. Nach dem Neustart des Servers ist er nun auf Port 443 über das Protokoll https erreichbar.

nginx

Ein weiterer, immer häufiger genutzter Webserver ist `nginx`. Dieser Server hat eine vollkommen andere Konfiguration als der 'Apache HTTP Server', wird aber genauso einfach mit SSL ausgerüstet. Im Folgenden auch wieder ein Grundgerüst eines bereits für den Einsatz von SSL vorbereiteten Virtual Host unter nginx.

Die Zeile mit der Direktive `listen` legt fest, dass dieser Virtual Host auf dem Port 443 horcht und das Protokoll SSL aktiviert ist. Der zusätzliche Parameter `default_server` wird für den ersten Virtual Host mit SSL benutzt, um festzulegen, dass bei einem Verbindungsversuch zunächst mit diesem Server Kontakt aufgenommen wird, falls mehrere Virtual Hosts mit SSL auf der gleichen IP konfiguriert sind. Über eine Erweiterung im SSL-Protokoll (SNI, "Server Name Indication") wird dann versucht, den passenden Virtual Host ausfindig zu machen.

Die Direktiven für den `server.key` und das `server.crt` sollten selbsterklärend sein. Allerdings scheint die Direktive für die Zertifikatskette zu fehlen. Die Zertifikate der Zertifikatskette werden an die Datei `server.crt` nach dem eigenen Zertifikat angehängt.

`ssl_protocols` und `ssl_ciphers` geben die verwendeten Protokolle und Verschlüssungsverfahren an. Die letzte Direktive `ssl_prefer_server_ciphers on` legt fest, dass sich der Server nicht an den Client anpasst, sondern fordert, dass sich der Client, in der Regel der Browser, an den Server anpasst. Die übrige Konfiguration entspricht der normalen Konfiguration eines Virtual Host ohne SSL.

So weit zum Thema OpenSSL und dessen Nutzung. Im nächsten Artikel dieser Reihe werden wir den Stream Editor `sed` ein wenig genauer vorstellen und einige interessante Nutzungsmöglichkeiten zeigen.