254 0 0

Nginx und Let's Encrypt Next-Gen-Setup

vom gridscale Team Nginx Security WebServer
Nginx mit LetsEncrypt absichern

Nginx noch einfacher mit Let’s Encrypt absichern

Vielleicht hast du meinen Artikel zu Nginx mit Let’s Encrypt gelesen und am Ende des Artikels den Link zu diesem Artikel gefunden.

In diesem kurzen Artikel möchte ich dir gerne eine Alternative aufzeigen, wie du Nginx noch einfacher mit Let’s Encrypt absichern – und zeitgleich mit meinem kleinen Shell-Skript die Erneuerung deiner SSL-Zertifikate vollständig automatisieren kannst.

NGinx mit Lets Encrypt

Danke an dieser Stelle auch an Mitchell Anicas, dessen Skript mir als Vorlage diente.

Vorbereitungen

Am besten klickst du dir kurz einen neuen Cloud Server zusammen und installierst ein paar Pakete auf diesem. Ich nutze meist Debian und installiere dann mit ‚apt-get install‘ die nötigen Pakete.

Da in meinem eingangs erwähnten Artikel bereits die Konfiguration und Installation im Detail beschrieben ist, überspringe ich die Beschreibung und poste hier nur die nötigen Kommandos für dich. Also, los gehts:

apt-get install bc git vim psmisc nginx openssl

Am besten legst du schon einmal einen neuen DNS IN A Rekord für die Domain an, die du gerne verwenden möchtest. Je nach Anbieter dauert die Aktualisierung der DNS Einstellungen eventuell ein paar Minuten.

Nun geh in das Verzeichnis ‚/etc/nginx/sites-enabled/‘ und öffne die dortige Default-Konfigurationsdatei. Ändere die Einträge wie folgt ab. Bitte beachte, dass ich die SSL Konfiguration noch nicht aktiviert habe und durch das Zeichen ‚#‘ auskommentiert habe.

Ersetze in der Konfiguration „DeineDomain.TLD“ durch die Domain, für die du bereits den DNS-Eintrag erstellt hast:

server {
    listen 80;
    listen [::]:80;
    
    server_name DeineDomain.TLD;
    
    #listen 443 ssl;
    #listen [::]:443 ssl;
    #ssl_certificate /etc/letsencrypt/live/DeineDomain.TLD/fullchain.pem;
    #ssl_certificate_key /etc/letsencrypt/live/DeineDomain.TLD/privkey.pem;
    
    #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #ssl_prefer_server_ciphers on;
    #ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    
    location ^~ /.well-known/acme-challenge/ {
    proxy_pass http://localhost:60000;
    }
    
    root /var/www/;
    index index.php index.html index.htm;

}

Bestimmt ist dir der neue Eintrag „location ^~/.well-known/acme-challenge/“ aufgefallen. Dieser Eintrag soll später dafür sorgen, dass die Anfragen der Let’s Encrypt Server an einen anderen Ort umgeleitet werden, damit die Verifizierung der Domain durchgeführt werden kann.

Starte nach der Änderung der Konfiguration deinen Nginx-Webserver neu.

Let’s Encrypt Konfiguration und erstes SSL Zertifikat

Nun clone das Repository von Let’s Encrypt nach /opt

$ git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Cloning into '/opt/letsencrypt'...
remote: Counting objects: 28778, done.
remote: Compressing objects: 100% (66/66), done.
remote: Total 28778 (delta 34), reused 0 (delta 0), pack-reused 28712
Receiving objects: 100% (28778/28778), 7.56 MiB | 4.67 MiB/s, done.
Resolving deltas: 100% (20238/20238), done.
Checking connectivity... done.

Erstelle das Verzeichnisse ‚/etc/letsencrypt/‘

mkdir -p /etc/letsencrypt

Erstelle nun eine Datei in dem soeben erstellten Verzeichnis mit Namen ‚cli.ini‘. Folgender Inhalt reicht für den Start aus. Bitte ersetze deine Email-Adresse an der Stelle, sonst hast du im Notfall keine Chance den Key deines SSL Zertifikates zu recovern.

rsa-key-size = 4096
email = email@domain.TLD
authenticator = standalone
standalone-supported-challenges = http-01

Nun begebe dich in das Verzeichnis ‚/opt/letsencrypt/‘ und rufe die Let’s Encrypt Suite auf. Tausche wieder ‚DeineDomain.TLD‘ aus.

./letsencrypt-auto certonly --domains DeineDomain.TLD --renew-by-default --agree-tos --http-01-port 60000

Voilà! Du solltest jetzt ein SSL Zertifikat erstellt haben. Du findest das Zertifikat in dem Verzeichnis ‚/etc/letsencrypt/live/DeineDomain.TLD/‘.

Jetzt öffne wieder die Nginx-Konfiguration und entferne die Kommentarzeichen ‚#‘ vor dem SSL Teil der Konfiguration.

listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/DeineDomain.TLD/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/DeineDomain.TLD/privkey.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

Nun starte den Nginx neu und teste, ob er auf Port 443 erreichbar ist. Die Verbindung ist nun mit deinem neuen Let’s Encrypt Zertifikat verschlüsselt.

Was ist passiert?

Du hast ein neues Zertifikat für deine Domain bei Let’s Encrypt angefragt. Um zu validieren, dass du auch wirklich für die angefragte Domain ein Zertifikat erhalten darfst, wurde eine Anfrage von Let’s Encrypt an deinen Webserver gestellt (Port 80).

Die Anfrage ging an ‚http://DeineDomain.TLD/.well-known/acme-challenge/$TOKEN‘. Nginx hat diesen Request erkannt und umgeleitet, an dein Backend auf http://localhost:60000. Dies hast du mit der Nginx-Konfigurationszeile: ‚proxy_pass http://localhost:60000;‘ veranlasst.

Auf dem Port 60000 unter localhost hast du wiederum dafür gesorgt, dass die Let’s Encrypt Suite einen Dienst gestartet hat (Parameter –http-01-port 60000).

Let’s Encrypt automatisieren

Damit du dich nicht mehr um die Verlängerung der Zertifikate kümmern musst, habe ich einen kleinen Proof of Concept gebaut. Du findest das Skript auf unserem BitBucket Account. Lade es dir einfach herunter und speichere es auf deinem Server.

wget https://bitbucket.org/gridscale/letsencrypt/raw/HEAD/le-autorenew.sh -O /usr/local/sbin/le-autorenew.sh

Öffne die Datei mit einem Editor und ändere zunächst den Parameter in Zeile 8 ‚exp_limit‘ auf z.b. 30. Verpasse dem Skript dann noch die Rechte zum ausführen:

chmod 750 /usr/local/sbin/le-autorenew.sh

Jetzt teste das Skript, indem du in die Konsole ‚le-autorenew.sh‘ tippst. Wenn alles klappt, erhältst du eine Notification, dass es aktuell nichts zu tun gibt und eine Verlängerung erst wieder in X Tagen anstehen wird.

Dann leg dir am besten einen Cronjob an, damit einmal täglich überprüft wird, ob es irgendwas zu tun gibt. Starte den Croneditor mit ‚crontab -e‘.

15 2 * * * /usr/local/sbin/le-autorenew.sh >> /var/log/le-autorenew.log

Herzlichen Glückwunsch, damit hast du Nginx mit Let’s Encrypt erfolgreich konfiguriert.

Schade, dass dir der Artikel nicht gefallen hat.
Was sollten wir deiner Meinung nach besser machen?

Vielen Dank für dein Feedback!
Wir melden uns bei dir, sobald der Artikel zu deinem Wunschthema fertig ist.

Übrigens: kennst du schon unser Tutorial zum Thema Linux Firewall – Ein Überblick?

×

Entwickler?

Dann einfach hier für unsere Tutorial-Updates anmelden.
Keine Sorge: Wir spammen dich nicht zu :)