feat(vm201): wildcard *.roa auto-renew via cPanel DNS-01 hook
Fix expirare cert wildcard *.roa.romfast.ro (incident 2026-05-31): renewal-ul era [Manual] DNS-01, nu rula din Scheduled Task -> 61 erori -> expirat. Subdomeniile Dokploy (efactura.roa etc.) dadeau ERR_CERT_DATE_INVALID. - cpanel-acme-dns.ps1: hook win-ACME DNS-01 (cPanel UAPI mass_edit_zone, fallback ZoneEdit) care pune/sterge TXT _acme-challenge automat - cpanel-dns.config.example.json: template (token-ul real e gitignored) - monitor-ssl-certificates.sh: sentinel efactura.roa (wildcard) + alerta in loc de auto-renew prin guest-exec (dezactivat) - README + doc cert: flux DNS-01 cPanel + acces OpenSSH VM 201 Renewal nou roa-wildcard-cpanel, auto, due 2026-08-19; vechiul [Manual] anulat. Cert live valid pana 2026-09-23. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -249,6 +249,66 @@ Get-ScheduledTask | Where-Object {$_.TaskName -like "*SSL*" -or $_.TaskName -lik
|
||||
grep ssl /etc/crontab
|
||||
```
|
||||
|
||||
## Wildcard `*.roa.romfast.ro` — Reînnoire Automată DNS-01 (cPanel)
|
||||
|
||||
> **Incident 2026-05-31:** wildcardul a expirat. Renewal-ul win-acme era de tip
|
||||
> `[Manual]` (DNS-01 cu TXT pus de mână) → nu rula din Scheduled Task → ~60 de
|
||||
> erori consecutive → expirare. Subdomeniile Dokploy (`efactura.roa…`, `space.roa…`)
|
||||
> dădeau `ERR_CERT_DATE_INVALID`. Monitorizarea nu prindea pentru că `*.roa` nu era
|
||||
> în lista de domenii verificate (era doar `roa.romfast.ro`, un cert separat).
|
||||
|
||||
Wildcardul **nu** poate folosi HTTP-01 (ca site-urile 1–6); necesită **DNS-01**.
|
||||
DNS-ul `romfast.ro` e pe **hosting.com (cPanel)**, fără plugin nativ în win-acme,
|
||||
deci folosim hook-ul de script `cpanel-acme-dns.ps1` care pune/șterge TXT-ul prin
|
||||
cPanel API.
|
||||
|
||||
### Setup (o singură dată, pe VM 201 ca Administrator)
|
||||
|
||||
1. cPanel → **Manage API Tokens** → creează token cu drept de editare DNS.
|
||||
2. Copiază pe VM 201:
|
||||
- `scripts/cpanel-acme-dns.ps1` → `C:\Tools\win-acme\cpanel-acme-dns.ps1`
|
||||
- `scripts/cpanel-dns.config.example.json` → `C:\Tools\win-acme\cpanel-dns.config.json`
|
||||
și completează `Hostname`, `User`, `ApiToken`. **Nu commite** fișierul real
|
||||
(e în `.gitignore`).
|
||||
3. Test manual:
|
||||
```powershell
|
||||
cd C:\Tools\win-acme
|
||||
.\cpanel-acme-dns.ps1 create _acme-challenge.roa.romfast.ro testvalue123
|
||||
# verifică TXT-ul în cPanel Zone Editor, apoi:
|
||||
.\cpanel-acme-dns.ps1 delete _acme-challenge.roa.romfast.ro testvalue123
|
||||
```
|
||||
4. Recreează renewal-ul wildcard:
|
||||
```
|
||||
.\wacs.exe (ca Administrator)
|
||||
M → Create renewal (full options)
|
||||
Source: Manual → *.roa.romfast.ro
|
||||
Validation: dns-01 → "Create verification records with your own script"
|
||||
Run create: Powershell.exe -File C:\Tools\win-acme\cpanel-acme-dns.ps1
|
||||
Create args : create {RecordName} {Token}
|
||||
Run delete: Powershell.exe -File C:\Tools\win-acme\cpanel-acme-dns.ps1
|
||||
Delete args : delete {RecordName} {Token}
|
||||
Store: Windows Certificate Store (My)
|
||||
Installation: IIS → site "roa-apps" (re-leagă certul automat pe binding)
|
||||
```
|
||||
5. Confirmă Scheduled task (rulând `wacs.exe` ca admin) → reînnoire 100% automată.
|
||||
|
||||
### Verificare
|
||||
```bash
|
||||
echo | openssl s_client -connect efactura.roa.romfast.ro:443 \
|
||||
-servername efactura.roa.romfast.ro 2>/dev/null | openssl x509 -noout -dates
|
||||
```
|
||||
|
||||
### Monitorizare
|
||||
`monitor-ssl-certificates.sh` include acum `efactura.roa.romfast.ro` ca **sentinel**
|
||||
pentru wildcard (Site ID `WILDCARD`). Dacă expiră, scriptul **alertează** (nu mai
|
||||
încearcă auto-renew prin guest-exec, care e dezactivat) → intervenție pe VM 201.
|
||||
|
||||
> **Securitate:** tokenul cPanel ajunge pe VM 201. Dă-i drepturi cât mai granulare
|
||||
> (doar DNS). Dacă panoul e vechi și expune doar API2 ZoneEdit, setează
|
||||
> `"LegacyZoneEdit": true` în config.
|
||||
|
||||
---
|
||||
|
||||
## Note Importante
|
||||
|
||||
- **SNI este OBLIGATORIU** pentru multiple certificate pe același IP:port
|
||||
|
||||
Reference in New Issue
Block a user