HowTo Relay/LoadBalancer für dns-01 konfigurieren

Die dns-01-Challenge ist eindeutig komplizierter als die meist als Default eingesetzte http-01-Challenge, allerdings behebt sie in unserem Nutzungskontext einige Probleme-

Das Hauptproblem sind die Domains streaming.media.ccc.de und cdn.c3voc.de, die von –derzeit– zwei LoadBalancern betrieben werden. Bei klassischer http-01-Challenge hinterlegen die Server die Challege-Response in einem Ordner unterhalb der Domain und Let's-Encrypt fragt diese dann an. Da die Domain aber von zwei Servern betreut wird besteht eine 50% Chance, dass LE die Datei vom falschen der beiden abfragt und daher das Renewal fehlschlägt. Vor dem 34C3 lief das so und da die LE-Clients es im Fehlerfall nach einiger Zeit erneut versuchen kam irgendwann auch mal eine erfolgreiche Challenge-Response durch – aber verlässlich ist das nicht und es bricht auch falls wir irgendwann mal mehr LBs als 2 einsetzen wollen.

Zusätzlich umgeht die dns-01 das Problem dass unsere Domains je nach Systemtyp einen nginx oder einem haproxy oder beiden bedient werden. Auch wird das Ausrollen von neuen Systemen einfacher, da nicht mehr unterschieden werden muss, ob bereits ein Dienst auf den Ports 80, 443 oder beiden lauscht oder noch nicht.

Letztenendes erlaubt es uns dns-01 auch Hosts mit korrekten LE-Zertifikaten zu versorgen, die selbst nicht im Internet Verfügbar sind (live.lan.c3voc.de auf einem nicht-Congess-Event z.B.).

Dies rechtfertigt mMn. die einmalige, komplexere Konfiguration. Während des Congresses empfiehlt es sich dennoch, die Letsencrypt-Fake für den Congress-Config zu verwenden.

Als voc@mngslave.dus.c3voc.de in einem Verzeichnis deiner Wahl folgendes ausführen:

/usr/sbin/dnssec-keygen -a HMAC-SHA256 -b 256 -n USER le-dns-challenge.live.somewhere.c3voc.de.

Das Kommando generiert zwei Dateien: Kle-dns-challenge.live.somewhere.c3voc.de.+163+*.{key,private} Die Zahl hinter +163+ ist offenbar eine Zufahllszahl, weil, kann man ja manchmal gebrauchen…

In /etc/bind/cdn-letsencrypt-dns-01.conf einen solchen Block einfügen. Darin das Secret aus der .key-Datei verwenden. Dieser Block macht den Key unter dem angegebenen Namen den bind-Server bekannt.

key "le-dns-challenge.live.somewhere.c3voc.de" {
  algorithm hmac-sha256;
  secret "xX3TgmAd0SesdD8wtK4kstrGZU7VYVbUC27V/S9qslk=";
};

In der gleichen Datei einen solchen Block einfügen: Dieser Block definiert eine neue Sub-Zone für die ACME-Challenges. Der Key wird nur in der Lage sein, diese Sub-Zone zu verändern.

zone "_acme-challenge.live.somewhere.c3voc.de" {
  type master;
  file "/var/cache/bind/_acme-challenge.live.somewhere.c3voc.de";
  masterfile-format text;
  allow-update { key "le-dns-challenge.live.somewhere.c3voc.de"; };
};

Wenn der neue Host ein LoadBalancer ist, den Key ebenfalls in die folgenden beiden Blöcke (am Ende der Datei) aufnehmen:

zone "_acme-challenge.cdn.c3voc.de" { … };
zone "_acme-challenge.streaming.media.ccc.de" { … };

Eine Datei /var/cache/bind/_acme-challenge.live.somewhere.c3voc.de mit folgendem Inhalt anlegen: Dies ist eine leere Zonendatei, die in Zukunft vom bind-Server verwaltet werden wird.

$ORIGIN .
$TTL 600	; 10 minutes
_acme-challenge.live.somewhere.c3voc.de IN SOA ns1.c3voc.de. fl.n621.de. (
				1          ; serial
				86400      ; refresh (1 day)
				7200       ; retry (2 hours)
				3600000    ; expire (5 weeks 6 days 16 hours)
				600        ; minimum (10 minutes)
				)
			NS	ns1.c3voc.de

In der Datei /etc/bind/zones/c3voc.de/zone.db am Angang die Serial-Nr um 1 erhöhen und am Ende einen solchen Block einfügen Dieser Block deligiert die Sub-Zone mit den ACME-Challenges an einen einzelnen DNS-Server (ns1.c3voc.de. \== mngslave.dus.c3voc.de.), so dass für die dns-01-Challenge nur dieser eine Server aktualisiert werden muss.

$ORIGIN _acme-challenge.live.somewhere.c3voc.de.
@             IN      NS     ns1.c3voc.de.

Zum Abschluss den DNS-Server reloaden: sudo service bind9 reload

In der Gruppe ansible/ssl/dns-01 einen Eintrag mit dem Titel live.somewhere.c3voc.de anlegen. Nutzername und Passwort leer lassen. Unter Advanced→Additional attributes zwei Einträge mit den Namen key und private anlegen. Den Inhalt der entsprechenden Datei einfügen, darauf achten, dass der Eintrag mit exakt einem Zeilenumbruch endet.

Ein Ansible-Deployment mit –tags letsencrypt sollte nun erfolgreich sein und alle nötigen Zertifikate anlegen.

  • letsencrypt_dns01.txt
  • Last modified: 2020/11/29 18:35
  • by andi