Tipp: SSL-Zertifikate im Webserver

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.

Die im Artikel angesprochenen Cipher zur Verschlüsselung der Webseiten sind keine sicheren Cipher, sie dienen nur dazu die Positionen zu zeigen an denen Cipher eingefügt werden sollten. Es macht keinen Sinn innerhalb einer Dokumentation sichere Cipher vorzugeben. Daher möchten wir hier auf das BetterCrypto.org – Projekt verweisen, die in ihren Dokumenationen die jeweils aktuellen Cipher besprechen und Vorschläge veröffentlichen.

Auch der Einsatz eines Webserver – Checks wie z. B. von SSLLabs Server TestSSLLabs sollte nach der Einrichtung eines über SSL abgesicherten Webservers durchgeführt werden.

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:

<VirtualHost *:80>
  DocumentRoot /var/www/htdocs
  ServerName linux-essentials.de
  ServerAdmin michael@gisbers.de
  <Directory "/var/www/htdocs">
    Options -Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

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:

Listen 443
<VirtualHost *:443>
  DocumentRoot /var/www/htdocs
  ServerName linux-essentials.de
  ServerAdmin michael@gisbers.de
  <Directory "/var/www/htdocs">
    Options -Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
  SSLEngine on
  SSLCipherSuite ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM
  SSLCertificateFile /etc/apache2/ssl/server.crt
  SSLCertificateKeyFile /etc/apache2/ssl/server.key
  SSLCertificateChainFile /etc/apache2/ssl/class3.crt
</VirtualHost>

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.

server {
    listen          443 ssl default_server;
    ssl_certificate      /etc/nginx/ssl/server.crt;
    ssl_certificate_key  /etc/nginx/ssl/server.key;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!RC4:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    [...]
}

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.