###### 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](letsencrypt_fake)-Config zu verwenden.
##### Schritt 1: DNSSEC-Keypair generieren
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…
##### 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.
\ 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\`
##### 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.