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 2012 mit Comodo als TCS-Provider im Einsatz war.

(warning) 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:


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.

  • No labels