Let’s Encrypt ist eine kostenlose und offene Zertifizierungsstelle, die von der Internet Security Research Group (ISRG) entwickelt wurde. Von Let’s Encrypt ausgestellte Zertifikate werden heute von fast allen Browsern als vertrauenswürdig eingestuft.
In diesem Tutorial stellen wir eine Schritt-für-Schritt-Anleitung bereit, wie Sie Ihr Nginx mit Let’s Encrypt mit dem certbot-Tool unter Ubuntu 16.04 sichern.
Voraussetzungen #
Stellen Sie sicher, dass Sie die folgenden Voraussetzungen erfüllt haben, bevor Sie mit diesem Lernprogramm fortfahren:
- Sie haben einen Domainnamen, der auf die IP Ihres öffentlichen Servers verweist. In diesem Tutorial verwenden wir
example.com
. - Sie haben Nginx installiert, indem Sie How To Install Nginx on Ubuntu 16.04. folgen
Installieren Sie Certbot #
Certbot ist ein in Python geschriebenes Dienstprogramm, das die Aufgaben zum Abrufen und Erneuern von SSL-Zertifikaten von Let’s Encrypt und zum Konfigurieren von Webservern automatisieren kann.
Installieren Sie zuerst software-properties-common
Paket, das das add-apt-repository
bereitstellt Tool, das zum Hinzufügen zusätzlicher PPAs benötigt wird.
Aktualisieren Sie den Paketindex und installieren Sie software-properties-common
mit:
sudo apt update
sudo apt install software-properties-common
Sobald die Installation abgeschlossen ist, fügen Sie das certbot PPA-Repository mit dem folgenden Befehl zu Ihrem System hinzu:
sudo add-apt-repository ppa:certbot/certbot
Aktualisieren Sie die Paketliste und installieren Sie das certbot-Paket:
sudo apt update
sudo apt install certbot
Generiere Strong 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, um die Sicherheit zu erhöhen:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Wenn Sie möchten, können Sie die Größe auf bis zu 4096 Bit ändern, aber in diesem Fall kann die Generierung je nach Systementropie mehr als 30 Minuten dauern. Ein SSL-Zertifikat von Let’s Encrypt erhalten #
Um ein SSL-Zertifikat für unsere Domain zu erhalten, verwenden wir das Webroot-Plug-in, das funktioniert, indem es eine temporäre Datei zur Validierung der angeforderten Domain im ${webroot-path}/.well-known/acme-challenge
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 Sie die folgenden zwei Snippets, die wir in alle unsere Nginx-Server-Blockdateien aufnehmen werden.
/etc/nginx/snippets/letsencrypt.conflocation ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
/etc/nginx/snippets/ssl.confssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
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=15768000; includeSubdomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
Das obige Snippet enthält die von Mozilla empfohlenen Chipper, aktiviert OCSP Stapling, HTTP Strict Transport Security (HSTS) und erzwingt wenige sicherheitsorientierte HTTP-Header.
Sobald die Snippets erstellt sind, öffnen Sie den Domänenserverblock und fügen Sie die letsencrypt.conf
ein Snippet wie unten gezeigt:
server {
listen 80;
server_name example.com www.example.com;
include snippets/letsencrypt.conf;
}
Aktivieren Sie die Serversperre, indem Sie einen symbolischen Link von sites-available
erstellen zu sites-enabled
:
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf
Laden Sie die Nginx-Konfiguration neu, damit die Änderungen wirksam werden:
sudo systemctl reload nginx
Führen Sie das certbot-Skript mit dem Webroot-Plugin aus und erhalten Sie die SSL-Zertifikatsdateien:
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 2018-04-23. 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
Nachdem wir nun die Zertifikatsdateien haben, bearbeiten Sie den Domänenserverblock wie folgt:
/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 HTTPS und leiten www
um Version der Domain zu nicht www
Version.
Laden Sie den Nginx-Dienst neu, damit die Änderungen wirksam werden:
sudo systemctl reload nginx
Automatische Erneuerung des SSL-Zertifikats #
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, der zweimal täglich ausgeführt wird und jedes Zertifikat 30 Tage vor seinem Ablauf automatisch verlängert.
Da wir nach der Erneuerung des Zertifikats das certbot-Webroot-Plug-in verwenden, müssen wir auch den nginx-Dienst neu laden. Hängen Sie dazu --renew-hook "systemctl reload nginx"
an zu /etc/cron.d/certbot
Datei so, dass sie so aussieht:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"
Um den Verlängerungsprozess zu testen, verwenden Sie den certbot --dry-run
Schalter:
sudo certbot renew --dry-run
Wenn keine Fehler vorliegen, bedeutet dies, dass der Erneuerungsprozess erfolgreich war.