Let’s Encrypt: kostenloses SSL-Zertifikat für Nginx einrichten

Let’s Encrypt: kostenloses SSL-Zertifikat für Nginx einrichten

Let’s Encrypt ist eine noch junge Zertifizierungsstelle, über die sich kostenlose TLS-/SSL-Zertifikate unkompliziert beziehen und installieren lassen, damit HTTPS-Anfragen an deine Webserver verschlüsselt laufen. Vereinfacht wird das Ganze durch eine Software namens Certbot, die den größten Teil der nötigen Schritte automatisiert. Und denk daran: Google will mit seinem Browser Chrome alle Nutzer vor unsicheren Seiten warnen, was sich auf dein Ranking auswirken kann.

In diesem Tutorial zeige ich dir, wie du mit Let’s Encrypt ein kostenloses SSL-Zertifikat für Nginx unter Ubuntu 14.04 bekommst. Außerdem zeige ich dir, wie du die Erneuerung automatisierst (ein Let’s-Encrypt-Zertifikat ist nur 90 Tage gültig).

Schritt 1, Certbot installieren

Was ist Certbot? Certbot schaltet HTTPS auf deiner Website automatisch frei, indem es Let’s-Encrypt-Zertifikate ausrollt. Wenn du weder Nginx noch Ubuntu 14.04 einsetzt, wirf einen Blick auf die Projektseite: dort ist für jedes System beschrieben, wie sich SSL-Zertifikate mit Let’s Encrypt erzeugen lassen.

Zuerst laden wir Certbot in das Verzeichnis /usr/local/sbin herunter:

code
cd /usr/local/sbin
wget https://dl.eff.org/certbot-auto

Vergiss nicht, die Datei ausführbar zu machen:

code
chmod a+x /usr/local/sbin/certbot-auto

Schritt 2, Ein Zertifikat beziehen

Damit Certbot auf das Verzeichnis zugreifen kann, passen wir kurz die Nginx-Konfiguration an. Standardmäßig liegt sie unter /etc/nginx/sites-available/default. Wir bearbeiten sie hier mit nano, du kannst aber jeden Editor nehmen, der dir liegt:

code
nano /etc/nginx/sites-available/default

Ergänze innerhalb des Server-Blocks:

code
server {

#votre configuration ...

location ~ /.well-known {
        allow all;
    }

}

Du brauchst das öffentliche Verzeichnis deiner Website. Mit der Standardkonfiguration ist das /usr/share/nginx/html, unter Laravel /path/to/public/.
Prüfe anschließend, ob es Fehler gibt.

code
nginx -t

Wenn alles passt, startest du Nginx neu:

code
service nginx restart

Schritt 3, TLS/SSL auf dem Nginx-Server konfigurieren

Jetzt, wo wir den öffentlichen Pfad kennen, können wir das Webroot-Plugin nutzen, um ein SSL-Zertifikat anzufordern. Die Domainnamen geben wir dabei über die Option -d an. Soll ein Zertifikat für mehrere Domainnamen gelten (etwa beispiel.de und www.beispiel.de), dann führe alle auf und beginne mit der obersten Domain (also beispiel.de). Achte außerdem darauf, die hervorgehobenen Stellen durch deinen Webroot-Pfad und deine Domainnamen zu ersetzen:

code
certbot-auto certonly -a webroot --webroot-path=/votre/chemin/public -d exemple.com -d www.exemple.com

Certbot fragt dich einiges ab, unter anderem deine E-Mail-Adresse: darüber wirst du benachrichtigt, wenn das Zertifikat demnächst abläuft. Wie sich die Erneuerung automatisieren lässt, sehen wir uns gleich an.

Die Zertifikate

Nachdem das Zertifikat ausgestellt ist, hast du folgende Dateien:

  • cert.pem: das Zertifikat deiner Domain
  • chain.pem: das Zertifikat von Let’s Encrypt
  • fullchain.pem: cert.pem und chain.pem zusammengefügt
  • privkey.pem: dein privater Schlüssel.

Diese Dateien liegen in einem Unterverzeichnis von /etc/letsencrypt/archive. Der Let’s-Encrypt-Client legt allerdings symbolische Links auf die jeweils aktuellen Zertifikate an, und zwar unter /etc/letsencrypt/live/votre_nom_de_domaine. Da diese Links immer auf die neuesten Zertifikate zeigen, ist das der Pfad, über den du dein aktuelles Zertifikat einbindest.

Einen Diffie-Hellman-Schlüssel erzeugen

Für zusätzliche Sicherheit solltest du außerdem einen Diffie-Hellman-Schlüssel mit 2048 Bit erzeugen:

code
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Das dauert ein paar Minuten, danach liegt deine DH-Datei unter /etc/ssl/certs/dhparam.pem.

Jetzt, wo das SSL-Zertifikat da ist, musst du Nginx so konfigurieren, dass er es auch benutzt.
Dafür öffnen wir unseren Server-Block noch einmal:

code
nano /etc/nginx/sites-available/default

Wir löschen die folgenden Zeilen, die Port 80 für HTTP-Anfragen abhören, oder kommentieren sie aus:

code
#listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;

Anschließend lassen wir Port 443 für HTTPS abhören:

code
listen 443 ssl;

Im Server-Block ergänzen wir zusätzlich den symbolischen Link, der auf die Zertifikate zeigt, die wir mit dem Befehl certbot-auto erzeugt haben:

code
ssl_certificate /etc/letsencrypt/live/exemple.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/exemple.com/privkey.pem;

Dazu kommt die SSL-Standardkonfiguration unseres Servers:

code
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

Und schließlich ergänzt du außerhalb deines Haupt-Server-Blocks diesen neuen Server-Block, der HTTP (Port 80) auf HTTPS (Port 443) umleitet.

code
server {
    listen 80;
    listen [::]:80;
    server_name exemple.com www.exemple.com;
    return 301 https://$host$request_uri;
}

Prüfe, ob deine Konfiguration Fehler enthält:

code
nginx -t

Danach startest du Nginx neu:

code
service nginx restart

Schritt 4, Das Zertifikat automatisch erneuern

Wie eingangs gesagt laufen die SSL-Zertifikate nach 90 Tagen ab und müssen erneuert werden. Falls du es vergisst, kommt rechtzeitig vor Ablauf eine E-Mail von Let’s Encrypt.

Damit die Erneuerung automatisch läuft, tragen wir den Befehl certbot-auto renew in die Cronjobs unseres Servers ein.

code
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload

Jeden Montag um 2:30 Uhr wird das Zertifikat erneuert, um 2:35 Uhr startet Nginx neu.

Fazit

Dein Webserver läuft jetzt mit einem anerkannten Zertifikat von Let’s Encrypt. Das ist eine gute Alternative zu kostenpflichtigen Zertifikaten. Viele Hoster wie OVH bieten SSL dank Let’s Encrypt ohnehin kostenlos an. Interessant ist das auch deshalb, weil Google die Websites Stück für Stück Richtung HTTPS drängt.

Quelle: digitalocean.com & wikipedia.org

···

Damien Flandrin Webentwickler seit 2010, Gründer von Gekkode und Email Impact. Jeder Artikel wird vor der Veröffentlichung an einem echten Projekt getestet. Kontakt
Newsletter

Neue Tests, Tutorials und Projekte, per E-Mail.

Reproduzierbare Tests, versionierter Code, datierte Ergebnisse. Niemals Spam.