So sichern Sie HAProxy mit Let’s Encrypt unter CentOS 7

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 Let’s Encrypt ein kostenloses SSL-Zertifikat erhalten und mit HAProxy unter CentOS 7 verwenden können. Wir zeigen Ihnen auch, wie Sie Ihr SSL-Zertifikat automatisch erneuern können.

image: https://assets.digitalocean.com/articles/letsencrypt/haproxy-letsencrypt.png [HAProxy mit Verschlüsselung des TLS / SSL-Zertifikats und automatischer Verlängerung]

Voraussetzungen

Bevor Sie diesem Tutorial folgen, benötigen Sie einige Dinge.

Sie sollten einen CentOS 7-Server mit einem Benutzer ohne Rootberechtigung haben, der über die Berechtigung "+ sudo +" verfügt. Sie erfahren, wie Sie ein solches Benutzerkonto einrichten, indem Sie die Schritte 1-3 unter initial server setup for CentOS ausführen 7 Tutorial.

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 einen * A-Eintrag * erstellen, der 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ür "+ example.com " erhalten möchten, muss diese Domain auf Ihren Server aufgelöst werden, damit der Überprüfungsprozess funktioniert. Unser Setup verwendet " example.com " und " www.example.com +" als Domainnamen, daher sind * beide DNS-Einträge erforderlich *.

Nachdem Sie alle Voraussetzungen erfüllt haben, können Sie Certbot, die Let’s Encrypt-Clientsoftware, installieren.

Schritt 1 - Installation von Certbot, dem Let’s Encrypt Client

Der erste Schritt zur Verwendung von Let’s Encrypt zum Abrufen eines SSL-Zertifikats besteht darin, die Software "+ certbot +" auf Ihrem Server zu installieren. Derzeit ist die beste Möglichkeit, dies zu installieren, das EPEL-Repository.

Aktivieren Sie den Zugriff auf das EPEL-Repository auf Ihrem Server, indem Sie Folgendes eingeben:

sudo yum install epel-release

Sobald das Repository aktiviert wurde, können Sie das Paket "+ certbot +" erhalten, indem Sie Folgendes eingeben:

sudo yum install certbot

Der "+ certbot +" Let´s Encrypt-Client sollte nun installiert und einsatzbereit sein.

Schritt 2 - Erhalt eines Zertifikats

Let’s Encrypt bietet verschiedene Möglichkeiten, SSL-Zertifikate über verschiedene Plugins abzurufen. Im Gegensatz zum Apache-Plugin, das unter https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-14-04 beschrieben ist, wird in einem anderen Tutorial beschrieben ], die meisten Plugins helfen Ihnen nur bei der Beschaffung 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 mit dem * Standalone * -Plugin ein SSL-Zertifikat 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 an Port "+ 80 " 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 setzt diese Methode voraus, dass der Port " 80 " nicht verwendet wird. Stellen Sie also sicher, dass Sie Ihren normalen Webserver anhalten, wenn er den Port " 80 " 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 systemctl stop haproxy

Wenn Sie nicht sicher sind, ob der Port "+ 80 +" verwendet wird, können Sie den folgenden 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  -d

Sie werden aufgefordert, Ihre E-Mail-Adresse einzugeben und den Nutzungsbedingungen von Let’s Encrypt zuzustimmen. Anschließend wird die "+ http " - Abfrage ausgeführt. Wenn alles erfolgreich ist, druckt " certbot +" eine Ausgabemeldung wie diese:

Output:IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
  /fullchain.pem. Your cert
  will expire on . 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 möchten den Pfad und das Ablaufdatum Ihres Zertifikats notieren, die in der obigen Beispielausgabe hervorgehoben wurden.

Zertifikatsdateien

Nach Erhalt des Zertifikats verfügen Sie über die folgenden PEM-codierten Dateien:

  • * cert.pem: * Das Zertifikat Ihrer Domain

  • * chain.pem: * Das Kettenzertifikat Let’s Encrypt

  • * fullchain.pem: * + cert.pem + und + chain.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 befinden sich in einem Unterverzeichnis in + / etc / letsencrypt / archive +. Certbot erstellt jedoch symbolische Links zu den neuesten Zertifikatsdateien im Verzeichnis + / etc / letsencrypt / live / +.

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/

Die Ausgabe sollte aus den vier zuvor genannten Zertifikatdateien bestehen.

Kombinieren Sie fullchain.pem und privkey.pem

Wenn Sie HAProxy für die Ausführung der SSL-Beendigung konfigurieren, damit der Datenverkehr zwischen HAProxy und dem Endbenutzer verschlüsselt wird, müssen Sie "+ fullchain.pem " und " privkey.pem +" in einer einzigen Datei kombinieren.

Erstellen Sie zunächst das Verzeichnis, in dem die kombinierte Datei abgelegt werden soll, + / etc / haproxy / certs +:

sudo mkdir -p /etc/haproxy/certs

Als nächstes erstellen Sie die kombinierte Datei mit diesem + cat + Befehl (ersetzen Sie das hervorgehobene + example.com + durch Ihren Domainnamen):

DOMAIN='' 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 - HAProxy installieren

Dieser Schritt behandelt die Installation von HAProxy. Wenn es bereits auf Ihrem Server installiert ist, überspringen Sie diesen Schritt.

Installieren Sie HAProxy mit yum:

sudo yum install haproxy

HAProxy ist jetzt installiert, muss aber konfiguriert werden.

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.

Öffne + haproxy.cfg + in einem Texteditor:

sudo vi /etc/haproxy/haproxy.cfg

Lassen Sie diese Datei geöffnet, während wir sie in den nächsten Abschnitten bearbeiten.

Globaler Abschnitt

Fügen Sie diese Zeile zum Abschnitt * global * hinzu, um die maximale Größe der generierten temporären DHE-Schlüssel zu konfigurieren:

haproxy.cfg - 1 von 5

  tune.ssl.default-dh-param 2048

Frontend-Bereiche

Jetzt können Sie Ihre "+ Frontend" -Abschnitte 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 Namen * www-http * hinzu. Stellen Sie sicher, dass Sie "+ haproxy_public_IP +" durch die öffentliche IP-Adresse Ihres HAProxy-Servers ersetzen:

haproxy.cfg - 2 von 5

frontend www-http
  bind :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 Namen * www-https * hinzu. Stellen Sie sicher, dass Sie "+ haproxy_www_public_IP " durch die öffentliche IP Ihres HAProxy-Servers ersetzen. Außerdem müssen Sie " example.com +" durch Ihren Domainnamen ersetzen (der der zuvor erstellten Zertifikatsdatei entsprechen sollte):

haproxy.cfg - 3 von 5

frontend www-https
  bind :443 ssl crt /etc/haproxy/certs/.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 (für " /. Well-known / acme-challenge ") an das " letsencrypt-backend " - Backend zu senden, die uns die Erneuerung ermöglichen das Zertifikat, ohne den HAProxy-Dienst zu stoppen. Alle anderen Anfragen werden an das " www-backend +" weitergeleitet, welches das Backend ist, das unsere Webanwendung oder Website bedienen wird.

Backend-Bereiche

Nachdem Sie die Frontends konfiguriert haben, fügen Sie das + www-backend + hinzu, indem Sie die folgenden Zeilen hinzufügen. Achten Sie darauf, die hervorgehobenen Wörter durch die jeweiligen privaten IP-Adressen Ihrer Webserver zu ersetzen (passen Sie die Anzahl der "+ Server +" - Zeilen an, um der Anzahl Ihrer Backend-Server zu entsprechen):

haproxy.cfg - 4 von 5

backend www-backend
  redirect scheme https if !{ ssl_fc }
  server www-1 :80 check
  server www-2 :80 check

Jeglicher Datenverkehr, den dieses Backend empfängt, wird über die Einträge "+ server +" über HTTP (Port 80) verteilt.

Zuletzt fügen Sie das "+ letsencrypt-backend +" hinzu, indem Sie diese Zeilen hinzufügen

haproxy.cfg - 5 von 5

backend letsencrypt-backend
  server letsencrypt 127.0.0.1:54321

Dieses Backend, das nur die für Zertifikatsanforderungen und -erneuerungen verwendeten Let’s Encrypt ACME-Anforderungen verarbeitet, sendet Datenverkehr an den Localhost auf Port "+ 54321 ". Wir werden diesen Port anstelle von " 80 " und " 443 +" verwenden, wenn wir unser SSL-Zertifikat "Let’s Encrypt" erneuern.

Jetzt können wir HAProxy starten:

sudo systemctl start haproxy

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 - Automatische Verlängerung einrichten

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 "+ certbot " täglich aus und erneuert die Zertifikate, wenn sie innerhalb von 30 Tagen nach Ablauf ablaufen. ` certbot ` führt nach jeder erfolgreichen Erneuerung auch ein spezielles ` renew-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

Öffne eine neue Datei in + / usr / local / bin + als * root *:

sudo vi /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=

# 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
systemctl reload haproxy

Speichern und schließen Sie die Datei. Dieses Skript wechselt in das richtige "Let’s Encrypt" -Verzeichnis, führt den Befehl "+ cat " aus, um die beiden " .pem +" -Dateien zu einer zu verbinden, 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. Als Nächstes aktualisieren wir Certbot und konfigurieren es so, dass dieses Erneuerungsskript ausgeführt wird.

Aktualisieren Sie die certbot-Konfigurationen

Der Befehl "+ certbot renew ", mit dem wir unsere Zertifikate erneuern, liest eine Konfigurationsdatei, die beim ersten Ausführen von " certbot " erstellt wurde. Wir müssen diese Datei öffnen und den Port aktualisieren, den " certbot +" zum Ausführen seines eigenständigen HTTP-Servers verwendet, damit kein Konflikt mit Haproxy entsteht (das bereits die Ports 80 und 443 überwacht). Öffnen Sie die Konfigurationsdatei in einem Texteditor:

sudo vi /etc/letsencrypt/renewal/.conf

Wir müssen die Zeile "+ http01_port +" ändern, damit sie so aussieht:

example.com.conf

http01_port =

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 Befehl + certbot 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 Befehl "+ certbot renew " ausführt. Die vom Befehl erzeugte Ausgabe wird an eine Protokolldatei weitergeleitet, die sich unter ` / 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 und " haproxy +" 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.