Let’s Encrypt: Verschlüsselung mit SSL/TLS unter Nginx

Let’s Encrypt ist ein noch recht junges (2015) und großartiges Projekt. Mehrere Internet-Dienstleister, darunter die Electronic Frontier Foundation (EFF), Mozilla, Google, Cisco und mehrere Universitäten unterstützen dieses Projekt.

Damit sollen über TLS/SSL verschlüsselte Verbindungen zum Standard im Internet werden, indem die Zertifizierung kostenlos und einfacher wird.

Das Zeitalter vor Let’s Encrypt

Bevor Let’s Encrypt ins Leben gerufen wurde, waren TLS/SSL-Zertifikate in der Regel nur gegen einen jährlichen Betrag erhältlich. Dieser ging an die Zertifizierungsstellen. Außerdem musste der Nutzer via E-Mail verifizieren, dass er tatsächlich der Inhaber der Domain ist.

Let’s Encrypt hat diesen Prozess weitgehend automatisiert. TLS/SSL-Zertifikate können über eine einzige Software aktiviert werden, die mittels API mit Let’s Encrypt interagiert. Dadurch, dass die Software auf dem jeweiligen Server installiert wird, kann direkt die (tatsächliche) Inhaberschaft über die Domain verifiziert werden.

Die generierten Zertifikate können unter Umständen sogar automatisch in die Server-Konfiguration integriert werden. Sie haben eine Laufzeit von 90 Tagen und können automatisch verlängert werden.

HowTo: Let’s Encrypt unter Nginx

Unter Nginx besteht unter Umständen die Möglichkeit, die Software auch die Integration der TLS/SSL-Zertifikate übernehmen zu lassen. In diesem Artikel gehe ich stattdessen auf den etwas komplizierteren Weg ein. Damit könnt ihr selber die Konfiguration vornehmen und überprüfen.

Wichtig: Die folgenden Befehle müssen als root-Benutzer ausgeführt werden. Sofern du einen anderen Benutzer nutzt, kann gegebenenfalls ein vorangestelltes „sudo “ verwendet werden.

1. Debian Backports installieren

Je nach Entwicklungsstand des Projekts, wenn ihr diesen Artikel lest, kann es unter Debian notwendig sein, die jeweiligen Backports zu installieren. Dabei handelt es sich vereinfacht gesagt um Beta-Pakete.

Führt die folgenden beiden Befehle auf dem Server aus, um die Backports zu den Paketquellen hinzuzufügen:

CODENAME=$(lsb_release -c | cut -d$'\t' -f 2)
echo "deb http://ftp.debian.org/debian $CODENAME-backports main" >> /etc/apt/sources.list

Anschließend aktualisieren wir die Paket-Informationen:

apt-get -y update

Solltet ihr statt Debian ein anderes System verwenden, solltet ihr euch informieren, wie dort die Vorgehensweise ist.

2. Certbot installieren

Nun installieren wir Certbot. Certbot ist eine Software der EFF, die mittels Let’s Encrypt HTTPS für die eigene Website ermöglicht.

Wir führen den folgenden Befehl aus:

apt-get -y install certbot -t $CODENAME-backports

Sofern du die Pakete nicht aus den backports installierst, reicht der erste Teil bis einschließlich „certbot“ aus.

3. Zertifikat einrichten

Nun wollen wir das Zertifikat für eine Domain einrichten. In diesem Fall soll die Domain über www.example.com und example.com via HTTPS erreichbar sein. Die Inhalte der Domain liegen unter /var/www/example/.

Alle Angaben solltet ihr auf eure Gegebenheiten anpassen.

Wir führen den folgenden Befehl aus:

certbot certonly --webroot -w /var/www/example -d www.example.com -d example.com

Nun wird Certbot euer Zertifikat generieren und  über die Let’s Encrypt API verifizieren. Am Ende der Ausgabe bekommt ihr einen Datei-Pfad angezeigt, z.B. /etc/letsencrypt/live/example.com/… In diesem Ordner liegen die Zertifikatsdateien.

Für optimale Sicherheit eurer TLS/SSL-Verbindung generieren wir noch einen Diffie-Hellmann-Schlüssel und legen diesen in dem gleichen Ordner ab. Das Ausführen des folgenden Befehls kann einige Minuten dauern (Anpassen der Domain/des Pfads nicht vergessen):

[[ -e dh2048.pem ]] || openssl dhparam -out /etc/letsencrypt/live/example.com/dh2048.pem 2048

Um per E-Mail über kritische Meldungen benachrichtigt zu werden, könnt ihr euch über den certbot registrieren.

4. Nginx Konfiguration

Ruft nun die jeweilige Nginx-Konfigurationsdatei mit dem vHost für eure Domain auf.

Falls ihr nicht wisst, wo sich diese befindet, öffnet zunächst das entsprechende Nginx Verzeichnis und lasst euch die enthaltenen Dateien anzeigen:

cd /etc/nginx/sites-enabled && ls

Die korrekte Datei könnt ihr nun mit dem Editor vi öffnen (und dann per [Einfg]-Taste editieren), z.B.:

vi default

Mehr Informationen über die vHosts und Server-Einträge erhaltet ihr hier.

Euer neue vHost – also die gesamte Datei – könnte beispielsweise auf dieses Beispiel angepasst werden:

# Unverschlüsselt und www auf https://Domain weiterleiten
server {
        listen 80;
        listen [::]:80;
        server_name example.com www.example.com; # BITTE ANPASSEN
        return 301 https://example.com$request_uri; # BITTE ANPASSEN
}

# HTTPS-Anfragen bearbeiten
server {
	listen 443;
	listen [::]:443;

	server_name example.com www.example.com; # BITTE ANPASSEN
	
	root /var/www/example; # BITTE ANPASSEN
	index index.php;

	# SSL/TLS-Abschnitt
	ssl on;
        ssl_certificate  /etc/letsencrypt/live/example.com/fullchain.pem; # example.com ANPASSEN
        ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem; # example.com ANPASSEN

        ssl_session_timeout  5m;

        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA:EECDH:EDH+AESGCM:EDH:+3DES:ECDH+AESGCM:ECDH+AES:ECDH:AES:HIGH:MEDIUM:!RC4:!CAMELLIA:!SEED:!aNULL:!MD5:!eNULL:!LOW:!EXP:!DSS:!PSK:!SRP;
        ssl_prefer_server_ciphers   on;
        ssl_dhparam /etc/letsencrypt/live/example.com/dh2048.pem; # example.com ANPASSEN
        # Ende des SSL/TLS-Abschnitts

        # AB HIER folgt deine restliche ursprüngliche Konfiguration (access_logs, location u.a. für die Verarbeitung von PHP etc.)

	
}

Die wichtigsten Anpassungen habe ich mit Kommentaren gekennzeichnet. Insbesondere solltest du nicht vergessen, die ursprüngliche Einstellungen (insbesondere alle location-Abschnitte) in den unteren Teil zu übernehmen.

Mit [Esc] und „:wq“ speicherst du die Datei.

Per

nginx -t

wird die Konfiguration geprüft. Wenn alles in Ordnung ist, kannst du die Nginx-Konfiguration neu einlesen lassen:

service nginx reload

Damit ist die Nginx Konfiguration abgeschlossen. Dank Let’s Encrypt lässt sich deine Website jetzt auch über HTTPS abrufen.

Die Konfiguration, die ich dir vorgestellt habe, gilt derzeit als besonders sicher. Es werden nur die sichersten Verschlüsselungsverfahren akzeptiert und Perfect Forward Secrecy (PFS) ist aktiv. Alle modernen Browser (Firefox und Chrome seit vielen Jahren, der Internet Explorer seit Version 8) unterstützten PFS ebenfalls. Über ältere Browser ist deine Website bei dieser Konfiguration nicht mehr abrufbar.

5. Automatische Verlängerung der Zertifikate

Da die Zertifikate bereits nach 90 Tagen auslaufen, solltest du sie automatisiert verlängern lassen. Dafür richten wir einen Eintrag in der Crontab ein, der Certbot ausführt und anschließend Nginx die Konfiguration neu einlesen lässt.

Mit einem kleinen Trick können wir das alles über die Kommandozeile machen und müssen nicht in einen Editor wechseln. Führt einfach die folgenden Befehle nacheinander aus:

crontab -l > cronedit
echo "42 2 * * * certbot renew --post-hook \"service nginx reload\"" >> cronedit
crontab cronedit
rm cronedit

Täglich um 2:42 Uhr wird Certbot die Zertifikate bei Bedarf über die Let’s Encrypt API verlängern.

6. Zertifikatsdateien sichern

Du solltest ab sofort daran denken, auch für den Ordner /etc/letsencrypt regelmäßig Backups anzulegen, um die Zertifikatsdateien zu sichern.

Fazit zu Let’s Encrypt

Let’s Encrypt ist tatsächlich eine kleine Revolution. Viele Webhoster unterstützen Let’s Encrypt bereits und ermöglichen damit ganz einfach ein kostenloses TLS/SSL-Zertifikat.

Webmaster, die ihr Nginx selbst verwalten, können außerdem – wie gezeigt – mit ein paar kleinen Handgriffen Let’s Encrypt und Certbot verwenden und die eigene Website bereit für HTTPS machen.

Viel Erfolg mit der verschlüsselten Version eurer Website!

 

 

2 Gedanken zu „Let’s Encrypt: Verschlüsselung mit SSL/TLS unter Nginx“

  1. Hi, super Tutorial, nur leider hängts bei mir an der Stelle mit certbot certonly –webroot usw.
    Da ich eine DynDNS-Adresse habe und diese nach der Nextcloudinstallation wohl nur noch unter https zu erreichen scheint, bekommt der Befehl von der Website entsprechend keine Antwort.
    Was kann ich tun?

    Danke!

    1. Hi Andy,

      Für die Erstzertifizierung solltest du dann (temporär):

      1. In der Konfigurationsdatei (zB von Nginx) auch den Port 80 akzeptieren (u.a. listen-Eintrag für den Port 80)

      2. Die Portfreigabe deines Routers auch auf Port 80 erweitern.

      Beste Grüße
      Tristan