Sichere Homepage mit Let's Encrypt

Letztes Update: 2016-01-17

Dank Let's Encrypt kann sich nun jeder kostenlos SSL-Zertifikate für die eigene Homepage signieren lassen, die dann von allen aktuellen Browsern auch anerkannt werden.

Qualys SSL Labs bieten eine Überprüfung der Webseite und des Zertifikats, berücksichtigen dabei die Stärke der Verschlüsselung, Anfälligkeit für Schwachstellen und insgesamt die Konfiguration des Dienstes. Die bestmögliche Bewertung ist ein A+.

Den kompletten Testbericht meiner Domain seht ihr hier: https://www.ssllabs.com/ssltest/analyze.html?d=b-root-force.de

Zertifikat erstellen

Wenn ihr auf eurem System den letsencrypt-Client installiert habt, dann könnt ihr euch damit ein Zertifikat erstellen, dieses automatisch von Let's Encrypt signieren lassen und gleichzeitig euren Webserver konfigurieren lassen.

Ich selbst bevorzuge dabei, meinen Webserver manuell zu konfigurieren. Deshalb verwende ich folgenden Befehl:

letsencrypt certonly --standalone --rsa-key-size 4096 -d b-root-force.de -d www.b-root-force.de -d gentoo.b-root-force.de

Dazu war aber notwendig, dass ich kurzzeitig mein nginx beende, da letsencrypt für die Überprüfung der Domains selbst einen kleinen Webserver auf Port 80 startet.

Wenn ihr --rsa-key-size 4096 weglasst, dann wird standardmäßig nur ein 2048 bit Schlüssel erstellt. Das reicht auch aus und ist performanter, bringt beim SSL Labs Test dann aber bei Cipher Strength keine 100%. Da ich aber keine hunderte Besucher am Tag habe, ist mir die Performance nicht so wichtig. Bei wirklich sensiblen Sachen wie Shops oder Banking würde ich die stärkere Verschlüsselung aber auch der Performance vorziehen.

Ihr dürft natürlich nicht vergessen, alle eure Domains dort anzugeben. Also die Haupt-Domain jeweils mit und ohne www. und dann alle weiteren Subdomains.

Die Zertifikate werden dann in /etc/letsencrypt/live/[domain] abgelegt, in meinem Fall also /etc/letsencrypt/live/b-root-force.de

Dann benötigt man noch eine Datei für den DH-Algorithmus. Diesen erzeuge ich mit ebenfalls 4096 bit, normal reicht aber auch 2048:

openssl dhparam -outform PEM -out /etc/letsencrypt/live/b-root-force.de/dhparam.pem 4096

nginx

Nun muss man nur noch nginx entsprechend konfigurieren. Dazu lege ich eine Datei an: /etc/nginx/ssl.conf:

listen 443 ssl;
add_header                Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header                X-Frame-Options SAMEORIGIN;

ssl_session_timeout       10m;
ssl_session_cache         shared:SSL:50m;
ssl                       on;
ssl_stapling              on;
ssl_protocols             TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve            secp384r1;
ssl_certificate           /etc/letsencrypt/live/b-root-force.de/fullchain.pem;
ssl_certificate_key       /etc/letsencrypt/live/b-root-force.de/privkey.pem;
ssl_dhparam               /etc/letsencrypt/live/b-root-force.de/dhparam.pem;

# nur 256 bit Verschlüsselung erlauben:
ssl_ciphers               ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA;

# 128 & 256 bit Verschlüsselung erlauben (wenn Performance eine Rolle spielt):
#ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;

In meiner /etc/nginx/nginx.conf passe ich dann entsprechend meine Konfiguration an:

    server {
        listen 80;
        server_name www.b-root-force.de b-root-force.de;
        return 301 https://$server_name$request_uri;
    }

    server {
        include ssl.conf;
        server_name www.b-root-force.de b-root-force.de;
        ...
    }

Damit werden alle Aufrufe über HTTP direkt auf HTTPS umgeleitet. Durch den Header Strict-Transport-Security wird dem Browser mitgeteilt, dass er zukünftig meine Seite nur noch per HTTPS aufrufen soll. Wenn man zukünftig wirklich plant, immer alle Seiten per HTTPS anzubieten, dann kann man sich ebenfalls hier eintragen: https://hstspreload.appspot.com/. Dann werdet ihr in eine öffentliche HSTS Preload Liste eingetragen, bei der sich Chrome, Firefox, IE und Edge bedienen. Wenn dann ein Besucher das allererste Mal auf eure Seite geht, wird sein Browser ihn direkt auf HTTPS schicken.

Dann halt nginx einmal neustarten und testen. Da die Let's Encrypt Zertifikate nur 90 Tage gültig sind, solltet ihr natürlich nicht vergessen, sie rechtzeitig neu zu generieren. Am besten die dhparam.pem auch. Und den nginx Neustart nicht vergessen. :)

Eine ausführlichere und auch technisch detailliertere Anleitung findet ihr auf der Seite von Stephan Herbers: Sichere NGINX TLS Konfiguration