eduardweb.
Apache & NginxIntermediar#devops#nginx#automation#letsencrypt#dns-01

Automatizarea certificatelor wildcard cu Let's Encrypt: Cum scapi de downtime-ul de 90 de zile

De Maria Vasilescu, 27 apr. 2026 · 1 vizualizări · 2 like-uri

Postat acum 3 ore
bash
# Instalare plugin pentru Cloudflare (exemplu pe Ubuntu/Debian)
sudo apt install python3-certbot-dns-cloudflare

# Creare fișier de credențiale (permisiuni 600 neapărat!)
# dns_cloudflare_api_token = YOUR_SCOPED_TOKEN

# Comanda magică pentru wildcard
sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials ~/.secrets/cloudflare.ini \
  -d domeniulmeu.ro \
  -d *.domeniulmeu.ro \
  --deploy-hook "systemctl reload nginx" \
  --non-interactive \
  --agree-tos

Am observat că multă lume fuge de certificatele wildcard (*.domeniu.ro) pentru că procesul de reînnoire li se pare complicat. Și pe bună dreptate, dacă încerci să o faci manual. La un certificat normal, Let's Encrypt face un HTTP-01 challenge: pune un fișier în .well-known și gata. Dar la wildcard, singura variantă acceptată e DNS-01 challenge. Adică trebuie să demonstrezi că deții domeniul adăugând un record TXT în DNS.

Problema e că certificatele Let's Encrypt expiră la 90 de zile. Dacă ai 5-6 proiecte, ajungi să fii un fel de secretară pentru recorduri DNS, stând mereu cu ochii pe calendar. Am pățit-o acum vreo 3 ani la un proiect cu vreo 12 subdomenii dinamice; am uitat de reînnoire și m-am trezit cu telefoane la 7 dimineața că „nu mai merge site-ul”. De atunci, am trecut totul pe automatizare completă prin API-ul providerului de DNS.

De ce DNS-01 și nu HTTP-01?

Simplu: securitate și flexibilitate. Wildcard-ul acoperă orice subdomeniu, deci Let's Encrypt vrea să fie 100% sigur că ai control asupra întregii zone DNS, nu doar asupra unui folder de pe un server web. Partea nasoală e că, spre deosebire de HTTP-01, nu poți doar să „trântești” un fișier pe disk. Trebuie să ai un mod prin care Certbot (sau ce client folosești) să poată „vorbi” cu providerul tău de DNS (Cloudflare, DigitalOcean, Route53 etc.) ca să adauge și să șteargă acel record TXT automat.

Secretul e în plugin-uri

Nu te apuca să scrii tu scripturi de bash care fac curl-uri în API-ul providerului. Certbot are plugin-uri dedicate pentru majoritatea providerilor mari. Eu folosesc masiv Cloudflare pentru că API-ul lor e stabil și plugin-ul de python-certbot-dns-cloudflare merge brici.

Am economisit cam 30% din timpul de mentenanță pe partea de ops de când am automatizat asta. Setup-ul durează 5 minute: instalezi plugin-ul, îi dai un token cu drepturi de editare DNS și cam atât. Dar aici apare un trade-off sincer despre care nu se vorbește destul: securitatea. Ca să automatizezi, trebuie să ții acel token de API pe server. Dacă cineva îți sparge serverul, are acces să îți modifice înregistrările DNS. De aceea, e critic să creezi un token cu „scoped permissions”, limitat doar la zona DNS de care ai nevoie, nu un Global API Key.

Capcana reîncărcării serverului (Unde pică mulți)

Cea mai mare greșeală pe care o văd e reînnoirea certificatului fără a anunța și serverul web. Certbot face reînnoirea în /etc/letsencrypt/live/, dar Nginx sau Apache țin certificatul vechi încărcat în memorie. Te trezești că deși ai certificatul nou pe disk, browserul tot eroare de expirare îți dă.

Folosiți întotdeauna parametrul --deploy-hook. Acesta rulează o singură dată, imediat după ce certificatul a fost emis cu succes. E mult mai eficient decât un cron job separat care dă restart la Nginx la nimereală. O comandă de systemctl reload nginx e suficientă și nu întrerupe conexiunile active, spre deosebire de restart.

Configurația care nu dă greș

În practică, un flow corect arată așa: Certbot cere certificatul -> Plugin-ul DNS pune recordul TXT -> Let's Encrypt verifică -> Certbot primește cert-ul -> Deploy hook dă reload la Nginx. Totul durează sub 30 de secunde și se întâmplă în background cât timp tu bei cafeaua.

Personal, prefer să rulez un dry-run imediat după setup. Dacă certbot renew --dry-run trece, poți să dormi liniștit. Voi ce folosiți pentru DNS-01? V-ați lovit de limitări la providerii locali care nu au API?

Răspunsuri 0

Se încarcă răspunsurile…

Loghează-te pentru a răspunde

Doar membrii comunității pot lăsa comentarii.