Einführung
Let's Encrypt ist eine neue Zertifizierungsstelle (Certificate Authority, CA), mit der auf einfache Weise kostenlose TLS / SSL-Zertifikate abgerufen und installiert werden können, wodurch verschlüsseltes HTTPS auf Webservern ermöglicht wird. Es vereinfacht den Prozess, indem ein Software-Client, Certbot, bereitgestellt wird, der versucht, die meisten erforderlichen Schritte zu automatisieren. Gegenwärtig ist der gesamte Vorgang zum Abrufen und Installieren eines Zertifikats nur auf Apache-Webservern vollständig automatisiert. Certbot kann jedoch verwendet werden, um auf einfache Weise ein kostenloses SSL-Zertifikat zu erhalten, das unabhängig von der von Ihnen gewählten Webserver-Software manuell installiert werden kann.
In diesem Tutorial zeigen wir Ihnen, wie Sie mit Certbot ein kostenloses SSL-Zertifikat erhalten und mit HAProxy unter Ubuntu 14.04 verwenden können. Wir zeigen Ihnen auch, wie Sie Ihr SSL-Zertifikat automatisch erneuern können.
Voraussetzungen
Bevor Sie diesem Tutorial folgen, benötigen Sie einige Dinge.
Sie sollten einen Ubuntu 14.04-Server mit einem Nicht-Root-Benutzer haben, der über die Berechtigungen vonsudo
verfügt. Sie können lernen, wie Sie ein solches Benutzerkonto einrichten, indem Sie die Schritte 1 bis 3 in unsereninitial server setup for Ubuntu 14.04 ausführen.
Sie müssen den registrierten Domainnamen besitzen oder kontrollieren, mit dem Sie das Zertifikat verwenden möchten. Wenn Sie noch keinen registrierten Domainnamen haben, können Sie einen bei einem der vielen Domainnamen-Registrare registrieren (z. Namecheap, GoDaddy usw.).
Wenn Sie dies noch nicht getan haben, müssen Sie einA Record erstellen, das Ihre Domain auf die öffentliche IP-Adresse Ihres Servers verweist. Dies ist erforderlich, da Let’s Encrypt überprüft, ob Sie die Domäne besitzen, für die ein Zertifikat ausgestellt wird. Wenn Sie beispielsweise ein Zertifikat fürexample.com
erhalten möchten, muss diese Domäne auf Ihrem Server aufgelöst werden, damit der Validierungsprozess funktioniert. Unser Setup verwendetexample.com
undwww.example.com
als Domainnamen, alsoboth DNS records are required.
Wenn Sie alle Voraussetzungen erfüllt haben, fahren Sie mit der Installation voncertbot
, der Let's Encrypt-Client-Software, fort.
[[Schritt-1 - Installieren des let-39-s-Verschlüsselungsclients]] == Schritt 1 - Installieren des Let's Encrypt-Clients
Der erste Schritt zur Verwendung von Let's Encrypt zum Abrufen eines SSL-Zertifikats besteht darin, diecertbot
-Software auf Ihrem Server zu installieren. Die Certbot-Entwickler stellen ein Repository mit aktuellen Versionen der Software zur Verfügung. Fügen wir dieses Repository jetzt unserem Paketmanager hinzu:
sudo add-apt-repository ppa:certbot/certbot
Sie werden aufgefordert, das Hinzufügen zu bestätigen. Drücken SieENTER
, um fortzufahren. Aktualisieren Sie anschließend den Paket-Cache, um die neue Paketliste abzurufen:
sudo apt-get update
Und schließlich installieren Sie das Paketcertbot
:
sudo apt-get install certbot
Nachdem wircertbot
installiert haben, können wir unser SSL-Zertifikat erhalten.
[[Schritt-2 -—- Erhalten eines Zertifikats]] == Schritt 2 - Erhalten eines Zertifikats
Let's Encrypt bietet eine Vielzahl von Möglichkeiten, SSL-Zertifikate über verschiedene Plugins abzurufen. Im Gegensatz zum Apache-Plugin, das ina different tutorial behandelt wird, helfen Ihnen die meisten Plugins nur beim Abrufen eines Zertifikats, für dessen Verwendung Sie Ihren Webserver manuell konfigurieren müssen. Plugins, die nur Zertifikate erhalten und diese nicht installieren, werden als "Authentifikatoren" bezeichnet, da sie zur Authentifizierung verwendet werden, ob einem Server ein Zertifikat ausgestellt werden soll.
Wir zeigen Ihnen, wie Sie dasStandalone-Plugin verwenden, um ein SSL-Zertifikat zu erhalten.
Stellen Sie sicher, dass Port 80 geöffnet ist
Das Standalone-Plugin bietet eine sehr einfache Möglichkeit, SSL-Zertifikate zu erhalten. Es funktioniert, indem vorübergehend ein kleiner Webserver (standardmäßig auf Port80
) auf Ihrem Server ausgeführt wird, mit dem die Let's Encrypt-Zertifizierungsstelle eine Verbindung herstellen und die Identität Ihres Servers überprüfen kann, bevor ein Zertifikat ausgestellt wird. Daher erfordert diese Methode, dass Port80
nicht verwendet wird. Stellen Sie also sicher, dass Sie Ihren normalen Webserver stoppen, wenn er Port80
verwendet (d. H. http
), bevor Sie versuchen, dieses Plugin zu verwenden.
Wenn Sie beispielsweise HAProxy verwenden, können Sie es stoppen, indem Sie den folgenden Befehl ausführen:
sudo service haproxy stop
Wenn Sie nicht sicher sind, ob Port80
verwendet wird, können Sie diesen Befehl ausführen:
netstat -na | grep ':80.*LISTEN'
Wenn Sie diesen Befehl ausführen und keine Ausgabe erhalten, können Sie das Standalone-Plugin verwenden.
Führen Sie Certbot aus
Verwenden Sie nun das Standalone-Plugin, indem Sie diesen Befehl ausführen:
sudo certbot certonly --standalone --preferred-challenges http --http-01-port 80 -d example.com -d www.example.com
Sie werden aufgefordert, Ihre E-Mail-Adresse einzugeben und den Nutzungsbedingungen von Let's Encrypt zuzustimmen. Danach wird die Herausforderung vonhttp
ausgeführt. Wenn alles erfolgreich ist, drucktcertbot
eine Ausgabenachricht wie folgt:
Output:IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert
will expire on 2017-09-06. 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
Sie sollten den Pfad und das Ablaufdatum Ihres Zertifikats notieren, die in der obigen Beispielausgabe hervorgehoben wurden.
[.note] #Note: Wenn Ihre Domain über einen DNS-Dienst wie CloudFlare geroutet wird, müssen Sie ihn vorübergehend deaktivieren, bis Sie das Zertifikat erhalten haben.
#
Zertifikatsdateien
Nach Erhalt des Zertifikats verfügen Sie über die folgenden PEM-codierten Dateien:
-
cert.pem: Das Zertifikat Ihrer Domain
-
chain.pem: Das Let's Encrypt-Kettenzertifikat
-
fullchain.pem:
cert.pem
undchain.pem
kombiniert -
privkey.pem: Der private Schlüssel Ihres Zertifikats
Es ist wichtig, dass Sie den Speicherort der soeben erstellten Zertifikatdateien kennen, damit Sie sie in Ihrer Webserverkonfiguration verwenden können. Die Dateien selbst werden in/etc/letsencrypt/archive
in einem Unterverzeichnis abgelegt. Certbot erstellt jedoch symbolische Links zu den neuesten Zertifikatdateien im Verzeichnis/etc/letsencrypt/live/your_domain_name
.
Sie können überprüfen, ob die Dateien vorhanden sind, indem Sie diesen Befehl ausführen (in Ihrem Domain-Namen ersetzen):
sudo ls /etc/letsencrypt/live/your_domain_name
Die Ausgabe sollte aus den vier zuvor genannten Zertifikatdateien bestehen.
Kombinieren Sie fullchain.pem und privkey.pem
Wenn Sie HAProxy so konfigurieren, dass eine SSL-Beendigung durchgeführt wird, damit der Datenverkehr zwischen ihm und dem Endbenutzer verschlüsselt wird, müssen Siefullchain.pem
undprivkey.pem
in einer einzigen Datei kombinieren.
Erstellen Sie zunächst das Verzeichnis/etc/haproxy/certs
, in dem die kombinierte Datei abgelegt werden soll:
sudo mkdir -p /etc/haproxy/certs
Erstellen Sie als Nächstes die kombinierte Datei mit diesem Befehlcat
(ersetzen Sie die hervorgehobenenexample.com
durch Ihren Domainnamen):
DOMAIN='example.com' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'
Sicherer Zugriff auf die kombinierte Datei, die den privaten Schlüssel enthält, mit diesem Befehl:
sudo chmod -R go-rwx /etc/haproxy/certs
Jetzt können wir das SSL-Zertifikat und den privaten Schlüssel mit HAProxy verwenden.
[[Schritt 3 - Installation von Haproxy]] == Schritt 3 - Installation von HAProxy
Dieser Schritt behandelt die Installation von HAProxy. Wenn es bereits auf Ihrem Server installiert ist, überspringen Sie diesen Schritt.
Wir werden HAProxy 1.6 installieren, das nicht in den Standard-Ubuntu-Repositories enthalten ist. Mit dem folgenden Befehl können wir jedoch weiterhin einen Paket-Manager zum Installieren von HAProxy 1.6 verwenden, wenn wir einen PPA verwenden:
sudo add-apt-repository ppa:vbernat/haproxy-1.6
Aktualisieren Sie den lokalen Paketindex auf Ihren Load Balancern und installieren Sie HAProxy, indem Sie Folgendes eingeben:
sudo apt-get update
sudo apt-get install haproxy
HAProxy ist jetzt installiert, muss aber konfiguriert werden.
[[Schritt-4 - Konfigurieren von Haproxy]] == Schritt 4 - Konfigurieren von HAProxy
In diesem Abschnitt erfahren Sie, wie Sie HAProxy mit SSL-Setup konfigurieren. Außerdem erfahren Sie, wie Sie HAProxy so konfigurieren, dass wir unser Let's Encrypt-Zertifikat automatisch erneuern können.
Öffnen Siehaproxy.cfg
in einem Texteditor:
sudo nano /etc/haproxy/haproxy.cfg
Lassen Sie diese Datei geöffnet, während wir sie in den nächsten Abschnitten bearbeiten.
Globaler Abschnitt
Fügen wir im Abschnittglobal
einige Grundeinstellungen hinzu.
Das erste, was Sie tun möchten, ist,maxconn auf eine vernünftige Zahl zu setzen. Dies wirkt sich darauf aus, wie viele gleichzeitige Verbindungen HAProxy zulässt. Dies kann sich auf die QoS auswirken und verhindern, dass Ihre Webserver abstürzen und versuchen, zu viele Anforderungen zu bedienen. Sie müssen damit herumspielen, um herauszufinden, was für Ihre Umgebung funktioniert. Fügen Sie dem Abschnittglobaldie folgende Zeile hinzu (mit einem Wert, den Sie für angemessen halten):
haproxy.cfg — 1 of 7
maxconn 2048
Fügen Sie als Nächstes diese Zeile hinzu, um die maximale Größe der generierten temporären DHE-Schlüssel zu konfigurieren:
haproxy.cfg — 2 of 7
tune.ssl.default-dh-param 2048
Abschnitt "Standardeinstellungen"
Fügen Sie die folgenden Zeilen unter dem Abschnittdefaults hinzu:
haproxy.cfg — 3 of 7
option forwardfor
option http-server-close
Mit der Option forwardfor wird HAProxy so eingestellt, dass jeder AnforderungX-Forwarded-For
-Header hinzugefügt werden, und mit der Optionhttp-server-close
wird die Latenz zwischen HAProxy und Ihren Benutzern reduziert, indem Verbindungen geschlossen, aber Keep-Alives beibehalten werden.
Frontend-Bereiche
Jetzt können wir die Abschnitte vonfrontend
definieren.
Als Erstes möchten wir ein Frontend hinzufügen, um eingehende HTTP-Verbindungen zu verarbeiten und diese an ein Standard-Backend zu senden (das wir später definieren werden). Fügen Sie am Ende der Datei ein Frontend mit dem Namenwww-http hinzu. Stellen Sie sicher, dass Siehaproxy_public_IP
durch die öffentliche IP-Adresse Ihres HAProxy-Servers ersetzen:
haproxy.cfg — 4 of 7
frontend www-http
bind haproxy_www_public_IP:80
reqadd X-Forwarded-Proto:\ http
default_backend www-backend
Als nächstes werden wir ein Frontend hinzufügen, um eingehende HTTPS-Verbindungen zu behandeln. Fügen Sie am Ende der Datei ein Frontend mit dem Namenwww-https hinzu. Stellen Sie sicher, dass Siehaproxy_www_public_IP
durch die öffentliche IP Ihres HAProxy-Servers ersetzen. Außerdem müssen Sieexample.com
durch Ihren Domainnamen ersetzen (der der zuvor erstellten Zertifikatdatei entsprechen sollte):
haproxy.cfg — 5 of 7
frontend www-https
bind haproxy_www_public_IP:443 ssl crt /etc/haproxy/certs/example.com.pem
reqadd X-Forwarded-Proto:\ https
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
use_backend letsencrypt-backend if letsencrypt-acl
default_backend www-backend
Dieses Frontend verwendet eine ACL (letsencrypt-acl
), um Validierungsanforderungen von Let's Encrypt (für/.well-known/acme-challenge
) an das Backend vonletsencrypt-backend
zu senden. Dadurch können wir das Zertifikat erneuern, ohne den HAProxy-Dienst zu beenden. Alle anderen Anfragen werden anwww-backend
weitergeleitet. Dies ist das Backend, das unsere Webanwendung oder Website bedient.
Backend-Bereiche
Nachdem Sie die Frontends konfiguriert haben, fügen Sie das Backend vonwww-backend
hinzu, indem Sie die folgenden Zeilen hinzufügen. Stellen Sie sicher, dass Sie die hervorgehobenen Wörter durch die jeweiligen privaten IP-Adressen Ihrer Webserver ersetzen (passen Sie die Anzahl derserver
-Zeilen an die Anzahl der Backend-Server an):
haproxy.cfg — 6 of 7
backend www-backend
redirect scheme https if !{ ssl_fc }
server www-1 www_1_private_IP:80 check
server www-2 www_2_private_IP:80 check
Der gesamte Datenverkehr, den dieses Backend empfängt, wird über HTTP (Port 80) auf dieserver
-Einträge verteilt.
Zuletzt fügen Sie das Backend vonletsencrypt-backend
hinzu, indem Sie diese Zeilen hinzufügen
haproxy.cfg — 7 of 7
backend letsencrypt-backend
server letsencrypt 127.0.0.1:54321
Dieses Backend, das nur ACME-Herausforderungen verschlüsselt, die für Zertifikatanforderungen und -erneuerungen verwendet werden, sendet Datenverkehr an den lokalen Host auf Port54321
. Wir werden diesen Port anstelle von80
und443
verwenden, wenn wir unser Let's Encrypt SSL-Zertifikat erneuern.
Jetzt können wir HAProxy starten:
sudo service haproxy restart
[.note] #Note: Wenn Sie Probleme mit der Konfigurationsdatei vonhaproxy.cfg
haben, sehen Sie sichthis GitHub Gist als Beispiel an.
#
Das TLS / SSL-Zertifikat von Let's Encrypt ist nun eingerichtet und wir können das Skript für die automatische Erneuerung einrichten. Zu diesem Zeitpunkt sollten Sie testen, ob das TLS / SSL-Zertifikat funktioniert, indem Sie Ihre Domain in einem Webbrowser besuchen.
[[Schritt 5 - Einrichten der automatischen Erneuerung]] == Schritt 5 - Einrichten der automatischen Erneuerung
Let 's Encrypt-Zertifikate sind nur 90 Tage gültig. Daher ist es wichtig, den Erneuerungsprozess zu automatisieren.
Eine praktische Möglichkeit, um sicherzustellen, dass Ihre Zertifikate nicht veraltet sind, besteht darin, einen Cron-Job zu erstellen, der den Erneuerungsprozess automatisch für Sie erledigt. Der Cronjob führt täglichcertbot
aus und erneuert die Zertifikate, wenn sie innerhalb von 30 Tagen nach Ablauf vorliegen. certbot
führt nach erfolgreicher Erneuerung auch ein speziellesrenew-hook
-Skript aus. Wir werden dieses Erneuerungsskript verwenden, um unsere kombinierte.pem
-Datei zu aktualisieren und Haproxy neu zu laden.
Lassen Sie uns das Skript jetzt erstellen und testen.
Erstellen Sie ein Erneuerungsskript
Öffnen Sie eine neue Datei in/usr/local/bin
alsroot:
sudo nano /usr/local/bin/renew.sh
Dies ist eine neue leere Textdatei. Fügen Sie das folgende kurze Skript ein und aktualisieren Sie den markierten Domainnamen mit Ihrem eigenen:
#!/bin/sh
SITE=example.com
# move to the correct let's encrypt directory
cd /etc/letsencrypt/live/$SITE
# cat files to make combined .pem for haproxy
cat fullchain.pem privkey.pem > /etc/haproxy/certs/$SITE.pem
# reload haproxy
service haproxy reload
Speichern und schließen Sie die Datei. Dieses Skript wechselt in das richtige Let's Encrypt-Verzeichnis, führt den Befehlcat
aus, um die beiden.pem
-Dateien zu einer zu verketten, und lädt dann haproxy neu.
Als nächstes machen Sie das Skript ausführbar:
sudo chmod u+x /usr/local/bin/renew.sh
Führen Sie dann das Skript aus:
sudo /usr/local/bin/renew.sh
Es sollte fehlerfrei laufen. Es wird eine Ausgabe zum erneuten Laden von Haproxy angezeigt. Als Nächstes aktualisieren wir Certbot und konfigurieren es so, dass dieses Erneuerungsskript ausgeführt wird.
Aktualisieren Sie die certbot-Konfigurationen
Der Befehlcertbot renew
, mit dem wir unsere Zertifikate erneuern, liest eine Konfigurationsdatei, die beim ersten Ausführen voncertbot
erstellt wurde. Wir müssen diese Datei öffnen und den Port aktualisieren, dencertbot
verwendet, um seinen eigenständigen http-Server auszuführen, damit er nicht mit Haproxy in Konflikt steht (der bereits die Ports 80 und 443 überwacht). Öffnen Sie die Konfigurationsdatei in einem Texteditor:
sudo nano /etc/letsencrypt/renewal/example.com.conf
Wir müssen die Zeilehttp01_port
ändern, damit sie wie folgt lautet:
example.com.conf
http01_port = 54321
Speichern und schließen Sie die Datei. Testen Sie nun den Erneuerungsprozess und geben Sie--dry-run
an, damit wir nichts erneuern:
sudo certbot renew --dry-run
Certbot überwacht Port 54321 auf die Erneuerungsaufforderung, und Haproxy überträgt die Anforderung von Port 80 auf 54321.
Erstellen Sie einen Cron-Job
Als Nächstes bearbeiten wir die Crontab, um einen neuen Job zu erstellen, der jeden Tag den Befehlcertbot renew
ausführt. Führen Sie Folgendes aus, um die Crontab für den Root-Benutzer zu bearbeiten:
sudo crontab -e
Fügen Sie am Ende der Datei Folgendes hinzu:
Crontab-Eintrag
30 2 * * * /usr/bin/certbot renew --renew-hook "/usr/local/bin/renew.sh" >> /var/log/le-renewal.log
Speichern und schließen. Dadurch wird ein neuer Cron-Job erstellt, der jeden Tag um 2:30 Uhr den Befehlcertbot renew
ausführt. Die vom Befehl erzeugte Ausgabe wird an eine Protokolldatei weitergeleitet, die sich bei/var/log/le-renewal.log
befindet. Wenn das Zertifikat tatsächlich erneuert wird, wird das Skript--renew-hook
ausgeführt, um die kombinierte PEM-Datei zu erstellen undhaproxy
neu zu laden.
Fazit
Das ist es! HAProxy verwendet jetzt ein kostenloses Let’s Encrypt TLS / SSL-Zertifikat, um den HTTPS-Verkehr sicher zu bedienen.