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.