Table of Contents | ||||||
---|---|---|---|---|---|---|
|
DCV-Automatisierung
Diese Seite beschreibt, wie an der Uni Wien die Domain Control Validation (DCV) im Rahmen des ACOnet-Zertifikats-Service (TCS) für SSL/TLS automatisiert wurde. Kommentare und Ergänzungen sind willkommen (vorzugsweise per mail an cert@aco.net).
Die hier gezeigte Lösung entspricht mit ganz wenigen Änderungen der, die bereits 2011 mit Comodo als TCS-Provider im Einsatz war.
Mit der Re-Validation bei Sectigo haben wir naturgemäß noch keine Erfahrungen.
Übersicht
Die Bestätigung des DCV-Challenges wurde an der Uni Wien automatisiert:
- einheitliche DCV-Adresse für alle Domains,
- umgeleitet auf einen Account, der über procmail verfügt
- ein kleines Perl-Script setzt den DCV-Code in die Validierungswebseite
Einheitliche DCV-Adresse
Als Mail-Adresse für DCV wird einheitlich die im übrigen bei uns nicht benötigte Adresse administrator@
domain eingesetzt.
An der Uni Wien werden alle TCS-berechtigten Domains über den zentralen Mailserver abgehandelt. Dadurch konnten diese Adressen einfach durch einen Wildcard-Virtualuser auf eine Zieladresse gemappt werden.
Erfolgsentscheidend ist, dass als Kontakt für die DCV die Adresse administrator@
domain angegeben wird (z.B. im API-Aufruf).
Procmail-Recipe (optional)
Das DCV-Script benötigt procmail nicht unbedingt, es kann natürlich direkt mit .forward oder einem vergleichbarem Mechanismus aufgerufen werden.
Für eine bessere Fehlererkennung wurde aber procmail mit folgendem Recipe eingesetzt:
Code Block |
---|
DCV_ADMIN=dcv-c@meine.domain.example DCV=$HOME/bin/dcv-automatik OUTF=$HOME/dcv-automatik.log P=$$ ###### DCV # # DCV-Challenge --> dcv-automatik # stdout/stderr --> dcv-automatik.log # # Bei Fehler zusaetzlich: # stdout/stderr --> dcv-automatik.$$ # Notification-Mail an dcv-c # # Offenbar hat Comodo unterschiedliche Templates fuer CSRs mit einer oder # mehreren Domains. Leider sind dabei Subject und From verschieden. # # DCV verwendet folgende Subjects: # ORDER #12345678 - Domain Control Validation for blibla.example # Demonstrate domain control and approve 2 domains for SSL/TLS certificate # order #12345678 # # DCV verwendet(e) folgende Froms: # <docs@comodo\.com> # <noreply_support@trust-provider.com> # <noreply_support@comodo.com> # :0 iw * Subject: (Demonstrate domain control and approve .* domains for SSL/TLS|\ ORDER #[0-9]+ - Domain Control Validation for) * From: .* (<noreply_support@comodo.com>|<noreply_support@trust-provider.com>|<docs@comodo\.com>) | set -o pipefail ; $DCV 2>&1 | tee $OUTF.$P >> $OUTF && rm -f $OUTF.$P :0 e | (cat $OUTF.$P ; echo ======= ; cat ) | mail -s "$DCV failed $P" $DCV_ADMIN # ###### |
Bitte vor Gebrauch die Adresse $DCV_ADMIN
setzen. An diese Adresse werden ggf. Fehlermeldungen geschickt.
Die Variable $DCV
definiert das Perl-Script, das die DCV-Validierung durchführt – also muß entweder das Script dort installiert oder die Variable angepaßt werden.
Ein kurzes Summary (Startzeit in UTC, Subject der Mail, erkannter Validierungs-URL, "Order Number", erkannter DCV-Code, "Success") jeder DCV-Aktion wird in das Logfile{{dcv-automatik.log}} geschrieben. Eine automatische Logfile-Rotation ist in Anbetracht der erwarteten Datenmenge nicht vorgesehen.
Wenn ein Fehler auftritt, also das DCV-Script nicht gefunden wird, nicht ausgeführt werden kann oder selbst mit einem Fehler aussteigt, passiert folgendes:
- der Output (stdout + stderr) wird zusätzlich in das File
dcv-automatik.log.
pid geschrieben (pid ist die Process-ID des procmail-Prozesses) - an
$DCV_ADMIN
wird eine Mail geschickt, die den Output des Scripts (also wohl eine Fehlermeldung) und die DCV-Mail selbst enthält. Das Subject enthält zur leichteren Zuordnung ebenfalls die Process-ID.
Perl-Script
Das Perl-Script dcv-automatik
ist unter GPL v. 3 freigelassen. Zur Installation ist folgendes zu beachten:
- Es muß auf geeignete Weise aufgerufen werden (z.B. durch das oben beschriebene Procmail-Recipe).
- Im script ist die Konstante
use constant from => '';
auf eine Kontakt-Mailadresse zu setzen. Diese wird mit den http-Headern mitgeschickt (RFC 2616, 14.22)
Das Script selbst ist simpel und verwendet lediglich LWP::UserAgent, sollte also auf zumindest jeder Posix-Umgebung funktionieren.