HowTo Relay/LoadBalancer für dns-01 konfigurieren
Warum eigentlich dns-01?
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-Config zu verwenden.
Schritt 1: DNSSEC-Keypair generieren
Als voc@mngslave.dus.c3voc.de in einem Verzeichnis deiner Wahl
folgendes ausführen: <code> /usr/sbin/dnssec-keygen -a HMAC-SHA256 -b
256 -n USER le-dns-challenge.live.somewhere.c3voc.de. </code> 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…
Schritt 2: Key in bind-config eintragen
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.
<code> key “le-dns-challenge.live.somewhere.c3voc.de” { algorithm
hmac-sha256; secret “xX3TgmAd0SesdD8wtK4kstrGZU7VYVbUC27V/S9qslk=”; };
</code>
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. <code> 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”; }; }; </code>
Wenn der neue Host ein LoadBalancer ist, den Key ebenfalls in die folgenden beiden Blöcke (am Ende der Datei) aufnehmen: <code> zone “_acme-challenge.cdn.c3voc.de” { … }; zone “_acme-challenge.streaming.media.ccc.de” { … }; </code>
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. <code> $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 </code>
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. <code> $ORIGIN _acme-challenge.live.somewhere.c3voc.de. @ IN
NS ns1.c3voc.de. </code>
Zum Abschluss den DNS-Server reloaden: `sudo service bind9 reload`
Key und Private in KeePass eintragen
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.
Schritt 4: Neuen Host deployen
Ein Ansible-Deployment mit –tags letsencrypt sollte nun erfolgreich
sein und alle nötigen Zertifikate anlegen.