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 erklärt, wie man ein kostenloses SSL-Zertifikat von Let’s Encrypt auf Ubuntu 20.04 installiert, auf dem Nginx als Webserver läuft. Wir zeigen auch, wie Nginx für die Verwendung des SSL-Zertifikats konfiguriert und HTTP/2 aktiviert wird.
Voraussetzungen #
Bevor Sie fortfahren, vergewissern Sie sich, dass Sie die folgenden Voraussetzungen erfüllt haben:
- Sie haben einen Domainnamen, der auf Ihre öffentliche IP verweist. Wir verwenden
example.com
. - Sie haben Nginx auf Ihrem CentOS-Server installiert.
- Ihre Firewall ist so konfiguriert, dass sie Verbindungen auf den Ports 80 und 443 akzeptiert.
Installieren von Certbot #
Wir verwenden certbot, 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-Ubuntu-Repositories enthalten. Um es zu installieren, führen Sie die folgenden Befehle aus:
sudo apt update
sudo apt install certbot
Generieren von starker Dh (Diffie-Hellman)-Gruppe #
Der Diffie-Hellman-Schlüsselaustausch (DH) ist eine Methode zum sicheren Austausch kryptografischer Schlüssel über einen ungesicherten Kommunikationskanal.
Generieren Sie einen neuen Satz von 2048-Bit-DH-Parametern, indem Sie den folgenden Befehl eingeben:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Sie können auch eine Schlüssellänge von bis zu 4096 Bit verwenden, die Generierung kann jedoch je nach Systementropie mehr als 30 Minuten dauern.
Ein SSL-Zertifikat von Let’s Encrypt erhalten #
Um ein SSL-Zertifikat für die Domäne zu erhalten, verwenden wir das Webroot-Plug-in, das eine temporäre Datei zur Validierung der angeforderten Domäne in ${webroot-path}/.well-known/acme-challenge
Verzeichnis. Der Let’s Encrypt-Server stellt 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.
Um es einfacher zu machen, werden wir alle HTTP-Anfragen für .well-known/acme-challenge
abbilden in ein einziges Verzeichnis, /var/lib/letsencrypt
.
Die folgenden Befehle erstellen das Verzeichnis und machen es für den Nginx-Server beschreibbar:
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 und fügen sie in alle Blockdateien des Nginx-Servers ein.
Ö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;
}
Als nächstes erstellen Sie das zweite Snippet, ssl.conf
, das die von Mozilla empfohlenen Chipper enthält, ermöglicht 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 on;
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=31536000; includeSubDomains" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
Sobald die Snippets erstellt sind, öffnen Sie 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;
}
Um den neuen Serverblock zu aktivieren, erstellen Sie einen symbolischen Link von der Datei zu sites-enabled
Verzeichnis:
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 Certbot jetzt mit dem Webroot-Plugin ausführen und die SSL-Zertifikatsdateien abrufen, indem Sie Folgendes ausgeben:
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 erhalten wurde, druckt certbot die folgende Nachricht:
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-10-18. 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"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- 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
Nachdem Sie nun die Zertifikatsdateien haben, können Sie Ihren Domänenserverblock wie folgt bearbeiten:
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
}
Mit der obigen Konfiguration erzwingen wir eine HTTPS-Umleitung von www zu einer Nicht-www-Version.
Laden Sie den Nginx-Dienst neu, damit die Änderungen wirksam werden:
sudo systemctl reload nginx
Um zu überprüfen, ob das SSL-Zertifikat erfolgreich installiert wurde, ö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, muss der nginx-Dienst neu geladen werden. Ö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
Um den Erneuerungsprozess zu testen, führen Sie certbot --dry-run
aus Befehl:
sudo certbot renew --dry-run
Wenn keine Fehler vorliegen, bedeutet dies, dass der Erneuerungsprozess erfolgreich war.