So sichern Sie HAProxy mit Let’s Encrypt unter Ubuntu 14.04

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.

HAProxy with Let’s Encrypt TLS/SSL Certificate and Auto-renewal

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 vonsudoverfü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 wircertbotinstalliert 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 vonhttpausgefü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 vonfrontenddefinieren.

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-backendhinzu, 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-backendhinzu, 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.cfghaben, 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-runan, 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 renewausfü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-hookausgefü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.