fix(vm201): roa-qr cert auto-renew + add to SSL monitor

Cauza ERR_CERT_DATE_INVALID pe roa-qr.romfast.ro: renewal-ul win-acme
avea Installation plugin "None" in loc de IIS -> certul se reinnoia in
store dar binding-ul SNI ramanea pe certul vechi (expirat 31 mai).

- monitor-ssl-certificates.sh: adaugat roa-qr.romfast.ro (Site ID 5);
  normalizat CRLF->LF (CRLF dadea exit 127 la exec pe Linux)
- docs: box incident 2026-06-25 cu cauza-radacina + diagnostic per renewal

Fix aplicat pe VM 201: plugin install None->IIS in renewal.json + force
renew (cert nou valid pana 23 sep 2026, binding auto-actualizat).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-06-25 14:01:00 +00:00
parent a41e9d81cf
commit 525919926c
2 changed files with 197 additions and 172 deletions

View File

@@ -206,6 +206,30 @@ iisreset
Win-acme poate reînnoi certificatele, dar IIS uneori nu aplică noile certificate pe binding-uri.
Acest lucru cauzează servirea certificatelor expirate chiar dacă cele noi sunt în Certificate Store.
> **Incident 2026-06-25 — `roa-qr.romfast.ro` servea cert expirat (31 mai).**
> Cauza-rădăcină: renewal-ul `roa-qr` fusese creat cu **Installation plugin = `None`**
> (`aecc502c-5f75-43d2-b578-f95d50c79ea1`) în loc de **IIS**
> (`ea6a5be3-f8de-4d27-a6bd-750b619b2ee2`). Win-acme reînnoia certul și-l punea în
> store (27 apr, 21 iun), dar **nu reactualiza niciodată binding-ul SNI** → binding-ul
> a rămas blocat pe certul din 2 mar, care a expirat pe 31 mai. (`wacs --list` arăta
> `roa-qr ... 1 error`.) Site-urile 14 erau OK pentru că au plugin-ul IIS.
>
> **Fix aplicat:** în `…\Renewals\<id>.renewal.json` (roa-qr =
> `kfRYWLrEAkSk_-XRqoobEQ`) am schimbat GUID-ul din `InstallationPluginOptions` pe
> cel de IIS, apoi `wacs.exe --renew --id <id> --force` → certul nou s-a legat
> **automat** pe binding (dovada că auto-renew-ul viitor funcționează). Backup:
> `<id>.renewal.json.bak-20260625`.
>
> **Diagnostic (ce plugin de install are fiecare renewal):**
> ```powershell
> $dir = "C:\ProgramData\win-acme\acme-v02.api.letsencrypt.org"
> Get-ChildItem $dir -Filter "*.renewal.json" | ForEach-Object {
> $j = Get-Content $_.FullName -Raw | ConvertFrom-Json
> "{0,-40} install={1}" -f $j.LastFriendlyName, $j.InstallationPluginOptions[0].Plugin
> }
> # ea6a5be3-... = IIS (corect) ; aecc502c-... = None (NU re-leagă binding-ul)
> ```
### Soluția: Scripturi de Monitorizare
#### 1. Script PowerShell pe VM 201

View File

@@ -24,11 +24,12 @@ DOMAINS=(
"dokploy.romfast.ro"
"gitea.romfast.ro"
"roa2web.romfast.ro"
"roa-qr.romfast.ro"
"efactura.roa.romfast.ro"
)
# Site IDs pentru fiecare domeniu (in aceeasi ordine)
SITE_IDS=(1 2 3 4 "WILDCARD")
SITE_IDS=(1 2 3 4 5 "WILDCARD")
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"