aethercert
Dokumentation

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 der bind ... ssl-Zeilen in haproxy.cfg. Ein crt kann 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, etwa stats socket /run/haproxy/admin.sock mode 660 level admin, und socat muss 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 | sha256sum

Die Reihenfolge ist Serverzertifikat, Zwischenzertifikate, privater Schlüssel. Die beiden Hashes müssen gleich sein.

Weg 1: Datei ersetzen und neu laden

  1. 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
  2. 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 haproxy

    Im ü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/null

show 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.bak zurück an seinen Platz verschieben, haproxy -c, neu laden.
  • Nach einer Runtime-API-Aktualisierung: dasselbe set/commit mit 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 admin aktiviert.

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

Auf dieser Seite