Wie man Nginx mit Let’s Encrypt auf Rocky Linux 9 sichert

Einführung

Let’s Encrypt ist eine Zertifizierungsstelle (CA), die einen zugänglichen Weg bietet, um kostenlose TLS/SSL-Zertifikate zu erhalten und zu installieren, wodurch verschlüsseltes HTTPS auf Webservern ermöglicht wird. Es vereinfacht den Prozess, indem es einen Softwareclient, Certbot, bereitstellt, der versucht, die meisten (wenn nicht alle) erforderlichen Schritte zu automatisieren. Der gesamte Prozess zum Erhalten und Installieren eines Zertifikats ist derzeit vollständig automatisiert sowohl für Apache als auch für Nginx.

In diesem Tutorial verwenden Sie Certbot, um ein kostenloses SSL-Zertifikat für Nginx auf Rocky Linux 9 zu erhalten und Ihr Zertifikat so einzurichten, dass es automatisch erneuert wird.

In diesem Tutorial wird eine separate Nginx-Serverkonfigurationsdatei anstelle der Standarddatei verwendet. Sie sollten neue Nginx-Serverblockdateien für jede Domäne erstellen, da dies dabei hilft, häufige Fehler zu vermeiden und die Standarddateien als Sicherungskonfiguration zu erhalten.

Voraussetzungen

Um diesem Tutorial folgen zu können, benötigen Sie:

  • Einen Rocky Linux 9 Server eingerichtet, indem Sie diesem Anleitung zum Initial-Setup für Rocky Linux 9-Tutorial gefolgt sind, einschließlich eines sudo-fähigen Nicht-Root-Benutzers und einer Firewall.

  • Einen registrierten Domainnamen. In diesem Tutorial wird durchgehend example.com verwendet. Sie können einen Domainnamen bei Namecheap kaufen, einen kostenlos bei Freenom erhalten oder den Domain-Registrar Ihrer Wahl verwenden.

  • Beide der folgenden DNS-Einträge für Ihren Server eingerichtet. Wenn Sie DigitalOcean verwenden, lesen Sie bitte unsere DNS-Dokumentation für Details dazu, wie Sie sie hinzufügen.

    • Einen A-Eintrag mit example.com, der auf die öffentliche IP-Adresse Ihres Servers zeigt.
    • Einen A-Eintrag mit www.example.com, der auf die öffentliche IP-Adresse Ihres Servers zeigt.
  • Nginx installiert gemäß Anleitung zur Installation von Nginx unter Rocky Linux 9. Stellen Sie sicher, dass Sie einen Serverblock für Ihre Domain haben. In diesem Tutorial wird /etc/nginx/sites-available/beispiel.com als Beispiel verwendet.

Schritt 1 — Certbot installieren

Zuerst müssen Sie das Softwarepaket certbot installieren. Melden Sie sich als nicht-root-Benutzer auf Ihrem Rocky Linux 8-Server an:

  1. ssh sammy@your_server_ip

Das Paket certbot steht standardmäßig nicht über den Paketmanager zur Verfügung. Sie müssen das EPEL-Repository aktivieren, um Certbot zu installieren.

Um das EPEL-Repository für Rocky Linux 9 hinzuzufügen, führen Sie den folgenden Befehl aus:

  1. sudo dnf install epel-release

Wenn Sie zur Bestätigung der Installation aufgefordert werden, geben Sie y ein und drücken Sie Enter.

Jetzt, da Sie Zugriff auf das zusätzliche Repository haben, installieren Sie alle erforderlichen Pakete:

  1. sudo dnf install certbot python3-certbot-nginx

Das installiert Certbot selbst und das Nginx-Plugin für Certbot, das benötigt wird, um das Programm auszuführen.

Der Installationsprozess wird Sie nach dem Importieren eines GPG-Schlüssels fragen. Bestätigen Sie dies, damit die Installation abgeschlossen werden kann.

Jetzt, da Certbot installiert ist, führen wir es aus, um ein Zertifikat zu erhalten.

Schritt 2 – Bestätigung der Nginx-Konfiguration

Certbot muss in der Lage sein, den richtigen server-Block in Ihrer Nginx-Konfiguration zu finden, um SSL automatisch konfigurieren zu können. Genauer gesagt sucht es nach einer server_name-Direktive, die mit der Domain übereinstimmt, für die Sie ein Zertifikat anfordern.

Wenn Sie dem Schritt zur Einrichtung des Serverblocks im Nginx-Installations-Tutorial gefolgt sind, sollten Sie einen Serverblock für Ihre Domain unter /etc/nginx/conf.d/beispiel.com mit der bereits entsprechend eingestellten server_name-Direktive haben.

Um dies zu überprüfen, öffnen Sie die Konfigurationsdatei für Ihre Domain mit nano oder Ihrem bevorzugten Texteditor:

  1. sudo nano /etc/nginx/conf.d/example.com

Finden Sie die vorhandene server_name-Zeile. Es sollte so aussehen:

/etc/nginx/conf.d/example.com
...
server_name example.com www.example.com;
...

Wenn dies der Fall ist, beenden Sie Ihren Editor und gehen Sie zum nächsten Schritt über.

Wenn nicht, aktualisieren Sie es entsprechend. Speichern Sie dann die Datei, beenden Sie Ihren Editor und überprüfen Sie die Syntax Ihrer Konfigurationsänderungen.

  1. sudo nginx -t

Wenn Sie einen Fehler erhalten, öffnen Sie die Serverblockdatei erneut und überprüfen Sie auf Tippfehler oder fehlende Zeichen. Sobald die Syntax Ihrer Konfigurationsdatei korrekt ist, laden Sie Nginx neu, um die neue Konfiguration zu laden:

  1. sudo systemctl reload nginx

Zertbot kann jetzt den richtigen server-Block finden und ihn automatisch aktualisieren.

Als nächstes aktualisieren wir die Firewall, um den HTTPS-Verkehr zuzulassen.

Schritt 3 — Aktualisierung der Firewall-Regeln

Da Ihre Voraussetzungseinstellung firewalld aktiviert, müssen Sie die Firewall-Einstellungen anpassen, um externe Verbindungen auf Ihrem Nginx-Webserver zu ermöglichen.

Um zu überprüfen, welche Dienste bereits aktiviert sind, führen Sie den Befehl aus:

  1. sudo firewall-cmd --permanent --list-all

Sie erhalten eine Ausgabe wie diese:

Output
public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

Wenn Sie http nicht in der Diensteliste sehen, aktivieren Sie es, indem Sie den folgenden Befehl ausführen:

  1. sudo firewall-cmd --permanent --add-service=http

Um den https-Verkehr zuzulassen, führen Sie den folgenden Befehl aus:

  1. sudo firewall-cmd --permanent --add-service=https

Um die Änderungen anzuwenden, müssen Sie den Firewall-Dienst neu laden:

  1. sudo firewall-cmd --reload

Jetzt, da Sie Ihren Server für HTTPS-Verkehr geöffnet haben, sind Sie bereit, Certbot auszuführen und Ihre Zertifikate abzurufen.

Schritt 4 — Erhalten eines SSL-Zertifikats

Certbot bietet verschiedene Möglichkeiten, SSL-Zertifikate über Plugins zu erhalten. Das Nginx-Plugin kümmert sich um die Neukonfiguration von Nginx und lädt die Konfiguration bei Bedarf neu. Um dieses Plugin zu verwenden, geben Sie Folgendes ein:

  1. sudo certbot --nginx -d example.com -d www.example.com

Dies führt certbot mit dem --nginx-Plugin aus und verwendet -d, um die Domainnamen anzugeben, für die das Zertifikat gültig sein soll.

Bei Ausführung des Befehls werden Sie aufgefordert, eine E-Mail-Adresse einzugeben und den Nutzungsbedingungen zuzustimmen. Nachdem Sie dies getan haben, sollten Sie eine Meldung sehen, die Ihnen mitteilt, dass der Vorgang erfolgreich war und wo sich Ihre Zertifikate befinden:

Output
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-12-15. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain

Ihre Zertifikate werden heruntergeladen, installiert und geladen, und Ihre Nginx-Konfiguration leitet jetzt automatisch alle Webanfragen an https:// weiter. Versuchen Sie, Ihre Website neu zu laden, und beachten Sie den Sicherheitsindikator Ihres Browsers. Er sollte anzeigen, dass die Website ordnungsgemäß gesichert ist, normalerweise mit einem Schlosssymbol. Wenn Sie Ihren Server mit dem SSL Labs Server Test testen, erhalten Sie eine A-Bewertung.

Lassen Sie uns abschließend den Erneuerungsprozess testen.

Schritt 5 — Überprüfen der Certbot-Automatischerneuerung

Let’s Encrypt-Zertifikate sind 90 Tage gültig, aber es wird empfohlen, die Zertifikate alle 60 Tage zu erneuern, um einen Fehlermargen zu ermöglichen. Der Certbot Let’s Encrypt-Client hat einen renew-Befehl, der automatisch die aktuell installierten Zertifikate überprüft und versucht, sie zu erneuern, wenn sie weniger als 30 Tage vom Ablaufdatum entfernt sind.

Sie können die automatische Verlängerung für Ihre Zertifikate testen, indem Sie diesen Befehl ausführen:

  1. sudo certbot renew --dry-run

Die Ausgabe wird ähnlich wie diese sein:

Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/your_domain.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator nginx, Installer nginx Renewing an existing certificate Performing the following challenges: http-01 challenge for monitoring.pp.ua Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of nginx server; fullchain is /etc/letsencrypt/live/your_domain/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/your_domain/fullchain.pem (success) ...

Beachten Sie, dass wenn Sie ein gebündeltes Zertifikat mit mehreren Domains erstellt haben, nur der Basiskomainame in der Ausgabe angezeigt wird, aber die Verlängerung für alle in diesem Zertifikat enthaltenen Domains funktionieren wird.

A practical way to ensure your certificates will not get outdated is to create a cron job that will periodically execute the automatic renewal command for you. Since the renewal first checks for the expiration date and only executes the renewal if the certificate is less than 30 days away from expiration, it is safe to create a cron job that runs every week, or even every day.

Bearbeiten Sie die Crontab, um einen neuen Job zu erstellen, der die Verlängerung zweimal täglich ausführt. Um die Crontab für den Root-Benutzer zu bearbeiten, führen Sie aus:

  1. sudo crontab -e

Ihr Texteditor öffnet die Standard-Crontab, die zu diesem Zeitpunkt eine leere Textdatei ist. Wechseln Sie in den Einfügemodus, indem Sie i drücken, und fügen Sie die folgende Zeile ein:

crontab
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet

Wenn Sie fertig sind, drücken Sie ESC, um den Einfügemodus zu verlassen, dann :wq und ENTER, um die Datei zu speichern und zu verlassen. Um mehr über den Texteditor Vi und dessen Nachfolger Vim zu erfahren, schauen Sie sich unser Installieren und Verwenden des Vim-Texteditors auf einem Cloud-Server-Tutorial an.

Dies erstellt einen neuen Cron-Job, der jeden Tag um 12 Uhr und Mitternacht ausgeführt wird. python -c 'import random; import time; time.sleep(random.random() * 3600)' wird eine zufällige Minute innerhalb der Stunde für Ihre Verlängerungsaufgaben auswählen.

Der Befehl renew für Certbot überprüft alle auf dem System installierten Zertifikate und aktualisiert alle, die in weniger als dreißig Tagen ablaufen. --quiet sagt Certbot, keine Informationen auszugeben oder auf Benutzereingaben zu warten.

Weitere ausführliche Informationen zur Verlängerung finden Sie in der Certbot-Dokumentation.

Fazit

In diesem Leitfaden haben Sie den Let’s Encrypt-Client Certbot installiert, SSL-Zertifikate für Ihre Domain heruntergeladen und die automatische Zertifikatverlängerung eingerichtet. Wenn Sie Fragen zur Verwendung von Certbot haben, können Sie die offizielle Certbot-Dokumentation überprüfen.

Sie können auch den offiziellen Let’s Encrypt-Blog auf wichtige Updates von Zeit zu Zeit überprüfen.

Source:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-rocky-linux-9