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 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.