Modulul 7 · 7.3
https cu Let's Encrypt
Modulul 7: Domeniu, server web și https · Timp de citire: 12 minute
Obiectivul lecției: După această lecție veți putea obține cu certbot un certificat gratuit de la Let's Encrypt pentru nginx, redirecționa http către https, verifica reînnoirea automată și rezolva cele mai frecvente erori care apar la o cerere de certificat.
Noțiuni cheie: certificat, autoritate de certificare (CA), ACME, Let's Encrypt, validarea domeniului, HTTP-01, DNS-01, TLS-ALPN-01, certbot, reînnoire, certbot renew --dry-run, durată de valabilitate, ARI, rate limits, staging, CAA, redirecționare către https
De ce https și ce dovedește un certificat
Fără https, tot ce circulă între browser și server trece necriptat prin rețea: parole, formulare, cookie-uri. Oricine se află pe traseu (o rețea wifi publică, un router compromis) poate citi sau modifica datele. De aceea browserele marchează site-urile http ca „nesigure”, iar unele funcții merg doar prin https. Pentru un seif de parole precum Vaultwarden (lecția 9.4), https este chiar obligatoriu.
https folosește TLS, iar pentru aceasta serverul dumneavoastră are nevoie de un certificat: o dovadă, semnată de o autoritate de certificare (CA) în care browserele au încredere, că această cheie aparține acestui nume. Un certificat obișnuit dovedește doar că solicitantul controlează numele de domeniu (validarea domeniului). Nu spune nimic despre cine sunteți sau dacă sunteți de încredere.
Let's Encrypt este o CA gratuită care emite doar certificate validate pe domeniu, complet automat, prin protocolul ACME. Un program de pe serverul dumneavoastră (clientul ACME) solicită certificatul, dovedește că deține controlul asupra numelui, îl instalează și îl reînnoiește la timp. Această lecție folosește certbot, clientul dezvoltat de EFF. Caddy (lecția 7.4) are un client ACME integrat.
Cum dovediți că dețineți controlul asupra numelui?
Let's Encrypt cunoaște trei tipuri de provocări (challenges):
| Provocare | Cum | Port | Wildcard (*.example.com) |
|---|---|---|---|
| HTTP-01 | plasarea unui fișier în http://<naam>/.well-known/acme-challenge/ | 80 | nu |
| DNS-01 | crearea unei înregistrări TXT _acme-challenge.<naam> | niciunul | da |
| TLS-ALPN-01 | prezentarea unui certificat special în timpul handshake-ului TLS | 443 | nu |
Pentru un VPS obișnuit cu un site, HTTP-01 este cea mai simplă variantă. Pentru aceasta este necesar ca:
- numele să indice serverul dumneavoastră prin A (și AAAA) (lecția 7.1);
- portul 80 să fie deschis pentru întreaga lume, chiar dacă site-ul folosește în rest doar https. Let's Encrypt validează doar prin portul 80 și din mai multe locuri de pe internet; nu puteți trece acele adrese în firewall;
- serverul să răspundă la fel prin IPv4 și prin IPv6. Dacă numele are o înregistrare AAAA, Let's Encrypt încearcă mai întâi IPv6. Doar dacă prin IPv6 nu se poate stabili deloc o conexiune, revine la IPv4.
DNS-01 vă trebuie pentru un certificat wildcard sau dacă serverul nu este accesibil din exterior. În acest caz, clientul ACME trebuie să vă poată modifica DNS-ul, de obicei printr-o cheie API de la furnizorul dumneavoastră de DNS. Această cheie poate modifica tot DNS-ul: păstrați-o la fel de atent ca pe o parolă.
Instalarea certbot
Dezvoltatorii certbot recomandă snap-ul, pentru că oferă întotdeauna cea mai nouă versiune. Pe Debian și Ubuntu îl puteți instala și direct din depozitul de pachete:
anna@web1:~$ sudo apt install certbot python3-certbot-nginxVersiunea din distribuție este mai veche, dar primește actualizări de securitate prin apt (lecțiile 4.1 și 4.2), ceea ce se potrivește cu restul acestui curs. Alegeți una dintre cele două variante, nu pe amândouă: două instalări se încurcă reciproc la reînnoire.
Solicitarea unui certificat
Cu site-ul din lecția 7.2 deja funcțional pe portul 80:
anna@web1:~$ sudo certbot --nginx -d example.com -d www.example.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address or hit Enter to skip.
(Enter 'c' to cancel):
...
Requesting a certificate for example.com and www.example.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2027-02-07.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for example.com to /etc/nginx/sites-enabled/example.com
Successfully deployed certificate for www.example.com to /etc/nginx/sites-enabled/example.com
Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.com(Data și detaliile sunt doar un exemplu.) Plug-in-ul --nginx face trei lucruri: pregătește temporar provocarea, obține certificatul și vă modifică server block-ul, adăugând un bloc listen 443 ssl și o redirecționare de la http la https. Dacă preferați să faceți asta singur, folosiți certbot certonly --nginx și adăugați dumneavoastră regulile în configurație.
Câteva lucruri la care să fiți atent:
- Solicitați dintr-odată toate numele care aparțin site-ului (
-dpentru fiecare nume). Fiecare nume trebuie să indice serverul, altfel întreaga cerere eșuează. - Cheia privată (
privkey.pem) se află în/etc/letsencrypt/live/și poate fi citită doar de root. Nu o copiați în alte locuri și nu o puneți niciodată într-un backup pe care îl pot citi alții. - Adresa de e-mail este opțională. Din iunie 2025, Let's Encrypt nu mai trimite e-mailuri când un certificat este pe cale să expire. Prin urmare, trebuie să monitorizați singur dacă reînnoirea reușește (lecția 8.3).
Redirecționarea http către https
După certbot, configurația dumneavoastră arată aproximativ așa (simplificat; certbot adaugă singur comentarii # managed by Certbot și uneori linii if):
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
root /var/www/example.com;
...
}Primul bloc redirecționează tot traficul http către același nume și aceeași cale prin https, cu o redirecționare permanentă (301). Fișierul de provocare pentru reînnoire funcționează în continuare: Let's Encrypt urmează această redirecționare. Al doilea bloc este site-ul propriu-zis. Dacă doriți să redirecționați și www către numele simplu (sau invers), faceți acest lucru într-un bloc separat, astfel încât vizitatorii să vadă un singur nume fix.
Reînnoirea: automată și verificată
Un certificat Let's Encrypt este în prezent valabil 90 de zile. Durata va scădea: Let's Encrypt a anunțat că profilul standard va emite certificate de 64 de zile începând cu 10 februarie 2027 și de 45 de zile începând cu 16 februarie 2028. Reînnoirea manuală nu este deci o opțiune; trebuie să se facă automat.
La instalare, certbot creează un timer systemd (sau o linie cron) care verifică de două ori pe zi dacă un certificat trebuie reînnoit. Verificați că acesta există și testați reînnoirea cu o cerere de probă:
anna@web1:~$ systemctl list-timers 'certbot*'
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2026-11-09 22:41:00 CET 9h left - - certbot.timer certbot.service
anna@web1:~$ sudo certbot renew --dry-run
...
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/example.com/fullchain.pem (success)După reînnoire, nginx trebuie să încarce și noul certificat. Cu plug-in-ul nginx, certbot se ocupă singur de acest lucru; dacă folosiți certonly, creați un deploy hook care reîncarcă nginx, de exemplu un script executabil în /etc/letsencrypt/renewal-hooks/deploy/ cu systemctl reload nginx.
Clienții ACME buni folosesc ARI (ACME Renewal Information): Let's Encrypt indică atunci singur când trebuie reînnoit un certificat, de exemplu mai devreme dacă există o problemă cu o serie de certificate. De aceea, țineți clientul la zi.
Dacă o cerere eșuează
| Mesaj (prescurtat) | Cauză | Soluție |
|---|---|---|
Timeout during connect (likely firewall problem) | portul 80 este închis sau numele indică o altă adresă | firewall (lecția 5.2), A/AAAA (lecția 7.1) |
Invalid response from http://.../.well-known/acme-challenge/...: 404 | răspunde un alt server sau un alt server block, adesea prin IPv6 | listen [::]:80, verificați înregistrarea AAAA |
CAA record for example.com prevents issuance | o înregistrare CAA permite doar o altă autoritate de certificare | modificați CAA (lecția 7.1) |
too many certificates already issued | o rate limit (limită de cereri) | așteptați; testați cu staging |
Let's Encrypt are rate limits (limite de cereri) pentru a preveni abuzurile. Cele mai importante: cel mult 50 de certificate noi per domeniu înregistrat la 7 zile, cel mult 5 certificate pentru exact același set de nume la 7 zile și cel mult 5 validări eșuate per nume pe oră. Cine experimentează și solicită certificatul iar și iar ajunge repede la aceste limite. De aceea, testați cu mediul de staging, care are limite mult mai largi, dar emite certificate în care browserele nu au încredere:
anna@web1:~$ sudo certbot certonly --nginx --staging -d test.example.comDacă acolo funcționează, solicitați certificatul real.
Pe AlmaLinux și Rocky Linux
Acolo, certbot provine din EPEL (dnf install certbot python3-certbot-nginx) sau este instalat ca snap. Plug-in-ul și comenzile sunt aceleași. Țineți cont de firewalld (--add-service=http --add-service=https) și de SELinux dacă certificatele se află într-un loc neobișnuit.
În practică
La un pachet de găzduire, panoul se ocupă de certificat în locul dumneavoastră (la WebOké și la alte firme de găzduire cu DirectAdmin, cPanel sau Plesk). Pe un VPS faceți acest lucru singur, cu certbot, Caddy sau clientul ACME care vine cu software-ul dumneavoastră. Acest lucru este valabil la orice furnizor.
Rezumat
- Un certificat Let's Encrypt dovedește că dețineți controlul asupra numelui; certbot îl solicită, îl instalează și îl reînnoiește prin ACME.
- HTTP-01 are nevoie de portul 80 deschis pentru toată lumea și de același răspuns prin IPv4 și IPv6; DNS-01 este pentru wildcard-uri.
certbot --nginx -d ... -d ...se ocupă de certificat și de redirecționarea către https; solicitați dintr-odată toate numele unui site.- Certificatele sunt acum valabile 90 de zile, iar durata va scădea; verificați timer-ul și
certbot renew --dry-runși monitorizați singur data de expirare. - Testați cu
--stagingpentru a evita rate limits; atenție la CAA.
Test (quiz)
Exercițiu
Exercițiul Z7.3: https cu un certificat valid. Solicitați un certificat pentru site-ul dumneavoastră (cu certbot sau Caddy), redirecționați http către https și testați reînnoirea cu certbot renew --dry-run (la Caddy: verificați în jurnale dacă certificatul a fost obținut). Introduceți numele site-ului dumneavoastră. Programul stabilește o conexiune TLS către portul 443 și verifică dacă certificatul este valid, este semnat de o autoritate de certificare de încredere și acoperă numele dumneavoastră, apoi solicită http://<naam>/ pentru a vedea dacă redirecționați către https. În plus, completați când expiră certificatul dumneavoastră și cum este organizată reînnoirea la dumneavoastră.
Lecturi suplimentare
- Activarea, reînnoirea și depanarea certificatului SSL
- Curs gratuit de DNS 5.2: CAA: cine are voie să emită certificate?
- Let's Encrypt, Challenge Types: https://letsencrypt.org/docs/challenge-types/
- Let's Encrypt, Rate Limits: https://letsencrypt.org/docs/rate-limits/
- Let's Encrypt, Decreasing Certificate Lifetimes to 45 Days: https://letsencrypt.org/2025/12/02/from-90-to-45
- Instrucțiuni certbot (nginx): https://certbot.eff.org/instructions?ws=nginx&os=snap
