Let’s Encrypt ist eine kostenlose, automatisierte und offene Zertifizierungsstelle, die von der Internet Security Research Group (ISRG) entwickelt wurde und kostenlose SSL-Zertifikate bereitstellt.
Von Let’s Encrypt ausgestellte Zertifikate werden von allen gängigen Browsern als vertrauenswürdig eingestuft und sind 90 Tage ab Ausstellungsdatum gültig.
Dieses Tutorial zeigt, wie man ein kostenloses SSL-Zertifikat von Let’s Encrypt auf Debian 10, Buster, auf dem Nginx als Webserver läuft, installiert. Wir zeigen auch, wie Nginx für die Verwendung des SSL-Zertifikats konfiguriert und HTTP/2 aktiviert wird.
Voraussetzungen #
Stellen Sie sicher, dass die folgenden Voraussetzungen erfüllt sind, bevor Sie mit der Anleitung fortfahren:
- Angemeldet als root oder Benutzer mit sudo-Berechtigungen.
- Die Domain, für die Sie das SSL-Zertifikat erhalten möchten, muss auf Ihre öffentliche Server-IP verweisen. Wir verwenden
example.com
. - Nginx installiert.
Installieren von Certbot #
Wir verwenden das certbot-Tool, um die Zertifikate zu erhalten und zu erneuern.
Certbot ist ein voll ausgestattetes und benutzerfreundliches Tool, das die Aufgaben zum Abrufen und Erneuern von SSL-Zertifikaten von Let’s Encrypt und zum Konfigurieren von Webservern für die Verwendung der Zertifikate automatisiert.
Das certbot-Paket ist in den Standard-Debian-Repositories enthalten. Führen Sie die folgenden Befehle aus, um certbot zu installieren:
sudo apt update
sudo apt install certbot
Generiere Dh (Diffie-Hellman) Gruppe #
Der Diffie-Hellman-Schlüsselaustausch (DH) ist eine Methode zum sicheren Austausch kryptografischer Schlüssel über einen ungesicherten Kommunikationskanal.
Wir werden einen neuen Satz von 2048-Bit-DH-Parametern generieren, um die Sicherheit zu erhöhen:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Sie können die Größe auch auf 4096 Bit ändern, aber die Generierung kann je nach Systementropie mehr als 30 Minuten dauern.
Ein SSL-Zertifikat von Let’s Encrypt erhalten #
Um ein SSL-Zertifikat für die Domain zu erhalten, verwenden wir das Webroot-Plugin. Es funktioniert durch Erstellen einer temporären Datei zum Validieren der angeforderten Domain im ${webroot-path}/.well-known/acme-challenge
Verzeichnis. Der Let’s Encrypt-Server sendet HTTP-Anforderungen an die temporäre Datei, um zu überprüfen, ob die angeforderte Domäne zu dem Server aufgelöst wird, auf dem certbot ausgeführt wird.
Wir werden alle HTTP-Anforderungen für .well-known/acme-challenge
abbilden in ein einziges Verzeichnis, /var/lib/letsencrypt
.
Führen Sie die folgenden Befehle aus, um das Verzeichnis zu erstellen und es für den Nginx-Server beschreibbar zu machen:
sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp www-data /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
Um doppelten Code zu vermeiden, erstellen wir zwei Snippets, die in alle Blockdateien des Nginx-Servers aufgenommen werden.
Öffnen Sie Ihren Texteditor und erstellen Sie das erste Snippet, letsencrypt.conf
:
sudo nano /etc/nginx/snippets/letsencrypt.conf
/etc/nginx/snippets/letsencrypt.conflocation ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
Der zweite Ausschnitt ssl.conf
enthält die von Mozilla empfohlenen Chipper, aktiviert OCSP Stapling, HTTP Strict Transport Security (HSTS) und erzwingt wenige sicherheitsorientierte HTTP-Header.
sudo nano /etc/nginx/snippets/ssl.conf
/etc/nginx/snippets/ssl.confssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
Öffnen Sie anschließend die Blockdatei des Domänenservers und fügen Sie die letsencrypt.conf
hinzu Snippet wie unten gezeigt:
sudo nano /etc/nginx/sites-available/example.com.conf
/etc/nginx/sites-available/example.com.confserver {
listen 80;
server_name example.com www.example.com;
include snippets/letsencrypt.conf;
}
Erstellen Sie einen symbolischen Link zu sites-enabled
Verzeichnis, um den Domänenserverblock zu aktivieren:
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
Starten Sie den Nginx-Dienst neu, damit die Änderungen wirksam werden:
sudo systemctl restart nginx
Sie können jetzt die SSL-Zertifikatsdateien abrufen, indem Sie den folgenden Befehl ausführen:
sudo certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
Wenn das SSL-Zertifikat erfolgreich bezogen wurde, wird die folgende Meldung auf Ihrem Terminal gedruckt:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2020-02-22. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Bearbeiten Sie den Domänenserverblock und fügen Sie die SSL-Zertifikatsdateien wie folgt ein:
sudo nano /etc/nginx/sites-available/example.com.conf
/etc/nginx/sites-available/example.com.confserver {
listen 80;
server_name www.example.com example.com;
include snippets/letsencrypt.conf;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
# . . . other code
}
Die obige Konfiguration weist Nginx an, von HTTP auf HTTPS und von der www-Version auf die nicht-www-Version umzuleiten.
Starten Sie den Nginx-Dienst neu oder laden Sie ihn neu, damit die Änderungen wirksam werden:
sudo systemctl restart nginx
Öffnen Sie Ihre Website mit https://
, und Sie werden ein grünes Schlosssymbol bemerken.
Wenn Sie Ihre Domain mit dem SSL Labs Server Test testen, erhalten Sie ein A+
Klasse, wie im Bild unten gezeigt:
SSL-Zertifikat von Let’s Encrypt automatisch verlängern #
Die Zertifikate von Let’s Encrypt sind 90 Tage gültig. Um die Zertifikate automatisch zu erneuern, bevor sie ablaufen, erstellt das certbot-Paket einen Cronjob und einen systemd-Timer. Der Timer erneuert die Zertifikate automatisch 30 Tage vor Ablauf.
Wenn das Zertifikat erneuert wird, müssen wir auch den nginx-Dienst neu laden. Öffnen Sie die /etc/letsencrypt/cli.ini
und fügen Sie die folgende Zeile hinzu:
sudo nano /etc/letsencrypt/cli.ini
/etc/cron.d/certbotdeploy-hook = systemctl reload nginx
Testen Sie den automatischen Erneuerungsprozess, indem Sie diesen Befehl ausführen:
sudo certbot renew --dry-run
Wenn keine Fehler vorliegen, bedeutet dies, dass der Erneuerungsprozess erfolgreich war.