Springe zum Inhalt

Let’s Encrypt, Nginx und viele Hosts

Mit dem Service von Let's Encrypt steht die Möglichkeit zur Verfügung, kostenlos Zertifikate für Webserver zu erhalten um die Webseite per HTTPS, also verschlüsselt, zugänglich zu machen. Für den Webserver Apache kann das Zertifikat automatisch erzeugt, signiert und installiert werden. Für Nginx ist in der Let's Encrypt-Installation zwar ein Modul enthalten, dieses ist nach eigenen Angaben jedoch noch nicht für den produktiven Einsatz ausgelegt.

Ich habe mich deshalb dafür entschieden, vom Let's Encrypt-Assistenten nur das Zertifikat selbst erstellen zu lassen und die Installation manuell vorzunehmen. Das Let's Encrypt-Script stellt dafür mit dem Parameter "certonly" eine Methode zur Verfügung, welche im Laufe des Zertifizierungsprozesses über ein spezielles Verzeichnis im Webroot der zu zertifizierenden Domain mit den Let's Encrypt-Servern kommuniziert und das Zertifikat anschließend in einem lokalen Verzeichnis zur Verfügung stellt.

Let's Encrypt-Client

Der Client kann mit folgendem Kommando heruntergeladen werden:

git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt/

Nginx

Da ich mehrere Domains in der gleichen Nginx-Instanz laufen lasse und selbst solche vorhanden sind, die nur Proxy sind, also kein eigenes Webroot-Verzeichnis haben, musste eine allgemeingültige Möglichkeit für alle Server gefunden werden, das Verzeichnis "/.well-known/acme-challenge/" erreichbar zu machen.

Ideal für solch eine Konfiguration ist die Möglichkeit von Nginx, Dateien in die jeweiligen Serverkonfigurationen zu includen. Unter "/etc/nginx/letsencrypt.conf" habe ich dazu eine Datei mit folgendem Inhalt angelegt:

location /.well-known/acme-challenge/ {
        alias /var/local/letsencrypt_webroot/$server_name/.well-known/acme-challenge/;
}

(Update: $hostname durch $server_name ersetzt)

und diese Datei anschließend mit "include letsencrypt.conf" in alle Hosts in "/etc/nginx/sites-enabled" in die entsprechenden "server {  }"-Abschnitte inkludiert. Die Variable "$server_name" wird anschließend bei jedem Request von Nginx automatisch mit dem in der Konfiguration angegeben Hostnamen ersetzt. Danach wird die Konfiguration von Nginx neu geladen:

nginx -s reload

Anschließend werden die Verzeichnisse für alle Hosts, auf die Nginx bei einem Request auf die oben angegebene URL zugreift, angelegt:

mkdir -p /var/local/letsencrypt_webroot/{blog,www,test}.example.org

Jetzt können die Zertifikate mit dem Let's Encrypt-Script angefordert werden:

./letsencrypt-auto certonly --webroot -w /var/local/letsencrypt_webroot/www.example.ort/ -d www.example.org

Nachdem die Zertifikate erfolgreich erzeugt und signiert wurden, sind diese in "/etc/letsencrypt/live/<domain>/" über einen symbolischen Link verfügbar. Sie müssen nun in die Nginx-Konfiguration des jeweiligen Hosts unter "/etc/nginx/sites-enabled/" eingetragen werden:

ssl_certificate /etc/letsencrypt/live/test.example.com/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/text.example.com/privkey.pem;

Nach einem erneuten Neuladen der Nginx-Konfiguration mit "nginx -s reload" läuft die entsprechende Domain ab jetzt mit den durch Let's Encrypt signierten Zertifikaten.

Probleme

Die Let's Encrypt-Server können das entsprechende Kommunikationsverzeichnis auf dem Webserver nicht erreichen. Eine Fehlermeldung könnte lauten:

Failed authorization procedure. test.example.org (http-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Could not connect to http://test.example.org/.well-known/acme-challenge/naviewohShuo0thaeb5ooch8fooPh0veeng6ve1Bah9p

Evtl. könnte durch andere Direktiven in der entsprechenden Nginx-Serverkonfiguration der Zugriff auf Verzeichnisse, die mit einem Punkt anfangen, verboten worden sein. Für WordPress-Installationen wird z.B. empfohlen, alle Zugriffe die mit einem Punkt beginnen zu blockieren. Diese Regel muss temporär deaktiviert oder so umgeschrieben werden, so dass sie nicht auf "/.well-known" zutrifft, umgeschrieben werden.

Nach der Konfiguration einiger Server wird man auf folgende Fehlermeldung stoßen:

An unexpected error occurred:
There were too many requests of a given type :: Error creating new cert :: Too many certificates already issued for: example.org

Im Moment lässt Let's Encrypt die Generierung von maximal fünf Zertifikaten pro Domain innerhalb von sieben Tagen zu. Hier hilft also nur abwarten.

Fazit

Mit Let's Encrypt steht eine einfache Möglichkeit zur Verfügung, für die eigene Webseite Zerifikate zu erhalten. Mit obiger Methode können die Zertifikate relativ einfach angefordert und in Nginx eingebunden werden.

Ein Gedanke zu „Let’s Encrypt, Nginx und viele Hosts

  1. Pingback: Seafile mit Nginx unter Ubuntu einsetzen | YuMDaP.net Blog

Kommentare sind geschlossen.