PDNS Manager

ACME / Auto-TLS

Wer Wildcard-Zertifikate (*.example.com) will, kommt am DNS-01-Challenge-Verfahren von Let's Encrypt nicht vorbei. Der PDNS Manager bringt dafür ein eigenes Token-System mit, das genau so viel kann wie nötig – nicht mehr.

Das Sicherheitsmodell

Ein ACME-Token hat den Prefix dnsmgr_acme_ und ist auf genau diese Operationen beschränkt:

  • Schreibe einen TXT-Record namens _acme-challenge.<domain>.
  • Lösche denselben TXT-Record nach erfolgreicher Validierung.

Es darf nur in den freigegebenen Zonen arbeiten (allowed_zones) und ausschließlich Records, deren Name auf _acme-challenge. beginnt. Selbst wenn ein Angreifer das Token bekommt, kann er keine A/MX/NS-Records anfassen, keine Zonen anlegen oder löschen, keine Settings ändern.

Token anlegen

Im Panel als Admin: Einstellungen → ACME-Tokens → Neues Token:

  • Name – z. B. „cert-renewer-vm1".
  • Erlaubte Zonen – Komma-Liste, longest-match. example.com erlaubt sowohl example.com als auch foo.example.com.
  • Ablauf – optional ein Datum.

Nach dem Speichern wird das Token genau einmal im Klartext angezeigt – kopiere es sofort an die Stelle, wo es gebraucht wird (z. B. in /etc/dnsmgr.env auf dem Cert-Renewer-Host). In der DB liegt nur ein SHA-256-Hash; verlorene Tokens lassen sich also nicht wiederherstellen, sondern nur ersetzen.

Mit certbot nutzen

Im Repo liegt fertig scripts/certbot-dns-dnsmanager.sh. Vorbereitung auf dem Cert-Renewer-Host:

# Hook-Skript ablegen und ausführbar machen
sudo cp certbot-dns-dnsmanager.sh /usr/local/bin/
sudo chmod +x /usr/local/bin/certbot-dns-dnsmanager.sh

# Token + URL hinterlegen
sudo install -m 600 /dev/stdin /etc/dnsmgr.env <<EOF
DNSMGR_URL=https://pdns.example.com
DNSMGR_TOKEN=dnsmgr_acme_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DNSMGR_PROPAGATE_SECONDS=30
EOF

Zertifikat anfordern:

certbot certonly \
  --manual --preferred-challenges dns \
  --manual-auth-hook   /usr/local/bin/certbot-dns-dnsmanager.sh \
  --manual-cleanup-hook /usr/local/bin/certbot-dns-dnsmanager.sh \
  -d "*.example.com" -d "example.com"

Was im Hook passiert: das Skript liest die certbot-Env-Variablen CERTBOT_DOMAIN und CERTBOT_VALIDATION, unterscheidet anhand von CERTBOT_AUTH_OUTPUT zwischen present und cleanup, und schickt das passende JSON an /api/v1/acme/present bzw. /api/v1/acme/cleanup.

Erneuerung automatisieren

Auf dem Renewer-Host einfach certbot renew in den System-Cron oder einen systemd-Timer hängen. Da die Hooks im Renewal-Config gespeichert werden, läuft alles ohne Eingriff.

Was im Audit-Log auftaucht

Jede ACME-Operation landet als eigene Audit-Zeile:

action=ACME_PRESENT  resource=_acme-challenge.example.com  user=acme:cert-renewer-vm1
action=ACME_CLEANUP  resource=_acme-challenge.example.com  user=acme:cert-renewer-vm1

So siehst du sofort, wenn ein Renewer hängt oder ein Token unerwartet aktiv wird.

Token rotieren

Im Panel das alte Token löschen, neues Token anlegen, neuen Wert in /etc/dnsmgr.env auf dem Cert-Host setzen, fertig. Die alten Zertifikate bleiben gültig – sie sind ja schon ausgestellt.

Hier ist noch kein Bild hinterlegt. Lege es unter src/assets/screenshots/<dateiname> ab und trage es in der Galerie-Liste ein.