HAProxy: SSL-Zertifikat ohne Ausfall austauschen
HAProxy-PEM-Bundle ohne Ausfall tauschen: bauen und prüfen, per Reload oder Runtime API aktualisieren, Platte und Speicher synchron halten, SNI prüfen und zurückrollen.
HAProxy lädt meist pro Zertifikat eine PEM-Datei, die Serverzertifikat, Zwischenzertifikate und privaten Schlüssel enthält. Ein Ersatz wird entweder mit einem Reload aktiv oder - ganz ohne Reload - über die Runtime API.
Voraussetzungen
- Ermitteln Sie die Zertifikatspfade, die HAProxy nutzt: die
crt-Angaben derbind ... ssl-Zeilen inhaproxy.cfg. Eincrtkann eine einzelne Datei sein, ein Verzeichnis (jede Datei darin wird geladen) oder eine crt-list (eine Liste von Zertifikatsdateien mit Optionen pro SNI). - Sichern Sie die aktuelle Datei:
cp -p /etc/haproxy/certs/site.pem /root/site.pem.bak. - Für den Weg über die Runtime API muss der Admin-Socket mit Admin-Stufe im
global-Abschnitt aktiviert sein, etwastats socket /run/haproxy/admin.sock mode 660 level admin, undsocatmuss installiert sein.
Bundle bauen und prüfen
cat leaf.pem intermediates.pem private.key > site.pem
chmod 0600 site.pem
openssl x509 -in site.pem -noout -subject -enddate
openssl pkey -in private.key -pubout | sha256sum
openssl x509 -in leaf.pem -noout -pubkey | sha256sumDie Reihenfolge ist Serverzertifikat, Zwischenzertifikate, privater Schlüssel. Die beiden Hashes müssen gleich sein.
Weg 1: Datei ersetzen und neu laden
-
Neue Datei neben der alten installieren und an ihre Stelle verschieben (ein Rename im selben Dateisystem ersetzt sie in einem Schritt):
install -m 0600 site.pem /etc/haproxy/certs/site.pem.new mv /etc/haproxy/certs/site.pem.new /etc/haproxy/certs/site.pem -
Konfiguration prüfen - das lädt und prüft auch das neue Zertifikat -, dann neu laden:
haproxy -c -f /etc/haproxy/haproxy.cfg && systemctl reload haproxyIm üblichen systemd-Betrieb (Master-Worker-Modus) startet ein Reload neue Worker mit dem neuen Zertifikat, während die alten ihre bestehenden Verbindungen beenden.
Bei einem Zertifikatsverzeichnis oder einer crt-list ersetzen Sie genau die Datei des erneuerten Zertifikats und behalten ihren Dateinamen, damit SNI-Auswahl und crt-list-Optionen gleich bleiben.
Weg 2: Live-Aktualisierung über die Runtime API
set ssl cert öffnet eine Transaktion mit dem neuen Inhalt, commit ssl cert aktiviert
sie, abort ssl cert verwirft sie. Der Pfad muss der sein, aus dem HAProxy das
Zertifikat geladen hat:
printf 'set ssl cert /etc/haproxy/certs/site.pem <<\n%s\n\n' "$(cat site.pem)" | \
socat stdio /run/haproxy/admin.sock
echo "commit ssl cert /etc/haproxy/certs/site.pem" | socat stdio /run/haproxy/admin.sockÄnderungen über die Runtime API liegen nur im Speicher. Installieren Sie die Datei auch
auf der Platte - Schritt 1 von Weg 1, ohne den Reload -, sonst bringt der nächste
Neustart das alte Zertifikat zurück. Eine Zertifikatsdatei, die HAProxy noch nicht
geladen hat, braucht zuerst einen Platz per new ssl cert und muss von einer
bind-Zeile oder crt-list referenziert werden.
Neues Zertifikat prüfen
echo "show ssl cert /etc/haproxy/certs/site.pem" | socat stdio /run/haproxy/admin.sock
openssl s_client -connect lb.example.com:443 -servername app.example.com -showcerts </dev/nullshow ssl cert zeigt Antragsteller, Seriennummer und Not After-Datum des geladenen
Zertifikats - es muss das neue sein. Prüfen Sie danach über das Netzwerk, mit jedem
Hostnamen als -servername. Bei mehreren HAProxy-Knoten aktualisieren und prüfen Sie
jeden einzeln.
Rollback
- Nach einem Reload:
/root/site.pem.bakzurück an seinen Platz verschieben,haproxy -c, neu laden. - Nach einer Runtime-API-Aktualisierung: dasselbe
set/commitmit dem Inhalt der Sicherung ausführen und auch die Datei auf der Platte zurückspielen.
Häufige Probleme
- Dem Bundle fehlt der private Schlüssel, oder die Teile stehen in falscher Reihenfolge.
- Die Runtime API wurde aktualisiert, die Datei auf der Platte nicht - ein Neustart bringt das alte Zertifikat zurück.
- Per SNI wird aus einem Verzeichnis oder einer crt-list ein anderes Zertifikat gewählt.
- Der Admin-Socket ist nicht mit
level adminaktiviert.
Zertifikatstausch mit aethercert automatisieren
Das aethercert-Deployment-Ziel für HAProxy baut das kombinierte PEM-Bundle. Es kann
set ssl cert und commit ssl cert über einen Runtime-API-Socket für eine
Live-Aktualisierung nutzen oder auf den konfigurierten Reload-Befehl zurückgreifen.
Unter Deployment-Ziele finden Sie die Felder dieser Vorlage, die Voraussetzungen auf dem Host und den Stand der Verifizierung.
Quellen
Apache HTTP Server
SSL-Zertifikat auf Apache 2.4 (Debian/Ubuntu und RHEL) austauschen: vHost-Dateien finden, Kette bauen, Schlüssel prüfen, apachectl configtest, Graceful Reload und Prüfung.
Eigener Linux-Dienst
Zertifikats- und Schlüsseldateien für einen beliebigen Linux-Dienst ersetzen: Format finden, Besitzer und Rechte setzen, atomar umschalten, testen, neu laden, HTTPS oder STARTTLS prüfen.