Zone gezielt bei Plesk erfragen statt alle Domains aufzulisten

Ein Name wie endian.fon-aria.de ist oft nur ein Record in der Zone
fon-aria.de und existiert weder als Domain noch als Abo. Ausserdem darf
nicht jeder API-User alle Domains des Servers auflisten - dann brach das
Tool mit "No domains found on the Plesk server" ab, obwohl die Zone da war.

Die Zone wird jetzt Label fuer Label von unten nach oben gezielt abgefragt
(endian.fon-aria.de -> fon-aria.de), jeweils per site.get und webspace.get
mit Namensfilter. Das Auflisten aller Domains dient nur noch der
Fehlermeldung, die jetzt auch zeigt, welche Namen probiert wurden und was
Plesk dazu gesagt hat.

- neue Option --zone, um die Zone bei Bedarf fest vorzugeben
- get_rec meldet jetzt als Warnung, wenn Plesk keine Records liefert
- run.sh baut das Image immer (Cache), damit kein alter Stand haengen bleibt
- Tests bilden den Fall nach: Zone nur als Abo auffindbar, Auflisten verboten

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-08-13 10:14:51 +02:00
co-authored by Claude Opus 5
parent fd76c18eb0
commit 611593b5c0
7 changed files with 181 additions and 42 deletions
+10 -3
View File
@@ -16,8 +16,11 @@ erzeugt ein Zertifikat für `vpn.example.com` **und** `*.vpn.example.com`.
## 1. Voraussetzungen
* Docker (oder lokal Python 3.10+)
* Die Domain muss auf dem Plesk-Server als DNS-Zone liegen und Plesk muss der
* Die **Zone** muss auf dem Plesk-Server liegen und Plesk muss der
**autoritative Nameserver** dafür sein (sonst kann die DNS-Challenge nicht validiert werden).
Der Name selbst braucht *kein* eigenes Abo und keine eigene Domain zu sein: für
`endian.fon-aria.de` reicht die Zone `fon-aria.de` das Tool sucht sich die
passende Zone von unten nach oben zusammen und legt dort einfach die Records an.
* Ein Plesk-API-Zugang (API-Key empfohlen).
### Plesk API-Key erzeugen
@@ -88,6 +91,7 @@ python -m app.main vpn.example.com 192.0.2.10
|---|---|
| `--ip <adresse>` | Alternative zum zweiten Positionsargument (IPv4 → A, IPv6 → AAAA) |
| `--san <name>` | zusätzlicher Name im Zertifikat (mehrfach möglich) |
| `--zone <zone>` | Plesk-Zone explizit angeben statt sie zu ermitteln |
| `--no-wildcard` | nur der reine Name, ohne `*.<fqdn>` |
| `--skip-dns` | A/AAAA-Record unangetastet lassen |
| `--dns-only` | nur DNS, kein Zertifikat |
@@ -130,7 +134,10 @@ openssl pkcs12 -info -in certs/vpn.example.com/cert.pfx -nodes -passin pass:<CER
## 5. Wie es abläuft
1. Plesk-Zone zum Namen suchen (längste passende Zone, z. B. `example.com` für `vpn.example.com`).
1. Plesk nach der Zone fragen erst nach dem vollen Namen, dann Label für Label
nach oben (`endian.fon-aria.de``fon-aria.de`), jeweils als Domain und als Abo.
Der Server muss dafür nicht alle Domains herausrücken; mit `--zone` lässt sich
die Zone auch fest vorgeben.
2. A/AAAA-Record anlegen oder auf die neue IP korrigieren.
3. Prüfen, ob überhaupt erneuert werden muss (`RENEW_DAYS_BEFORE_EXPIRY`, Standard 30 Tage).
4. Key + CSR für `<fqdn>` und `*.<fqdn>` erzeugen.
@@ -155,7 +162,7 @@ Das Skript ist idempotent: Läuft es, obwohl das Zertifikat noch länger als
| Symptom | Ursache / Lösung |
|---|---|
| `Plesk rejected the credentials (HTTP 401)` | API-Key falsch oder nicht für diese Quell-IP erzeugt |
| `No Plesk DNS zone found for …` | Domain liegt nicht auf diesem Plesk oder der API-User sieht sie nicht |
| `No Plesk DNS zone found for …` | Zone liegt nicht auf diesem Plesk oder der API-User sieht sie nicht. Die Meldung listet auf, welche Namen probiert wurden und was Plesk dazu gesagt hat. Notfalls die Zone mit `--zone example.com` fest vorgeben |
| `DNS propagation timed out` | Plesk ist nicht der autoritative NS, oder die Zone ist deaktiviert. Mit `-v` prüfen, welcher Nameserver antwortet |
| `no dns-01 challenge` | Wildcards gehen ausschließlich über DNS-01 Domain-Validierung per HTTP ist nicht möglich |
| `urn:ietf:params:acme:error:rateLimited` | Rate-Limit von Let's Encrypt (5 Zertifikate pro Woche pro Domain). Erst mit `--staging` testen |