7 modulis · 7.3
https su Let's Encrypt
7 modulis: Domenas, žiniatinklio serveris ir https · Skaitymo laikas: 12 min.
Mokymosi tikslas: Po šios pamokos galėsite su certbot užsisakyti nemokamą Let's Encrypt sertifikatą nginx serveriui, nukreipti http į https, patikrinti automatinį atnaujinimą ir išspręsti dažniausiai pasitaikančias užklausos klaidas.
Pagrindinės sąvokos: sertifikatas, sertifikatų išdavėjas (CA), ACME, Let's Encrypt, domeno patvirtinimas, HTTP-01, DNS-01, TLS-ALPN-01, certbot, atnaujinimas, certbot renew --dry-run, galiojimo trukmė, ARI, užklausų limitai (rate limits), staging, CAA, nukreipimas į https
Kodėl https ir ką įrodo sertifikatas
Be https viskas tarp naršyklės ir serverio keliauja tinklu nešifruota: slaptažodžiai, formos, slapukai. Bet kas pakeliui (viešas belaidis tinklas, įsilaužtas maršrutizatorius) gali tai skaityti arba pakeisti. Todėl naršyklės http svetaines žymi kaip "nesaugias", o kai kurios funkcijos veikia tik per https. Slaptažodžių saugyklai, pavyzdžiui, Vaultwarden (pamoka 9.4), https netgi privalomas.
https naudoja TLS, o tam Jūsų serveriui reikia sertifikato: įrodymo, pasirašyto naršyklių pasitikimo sertifikatų išdavėjo (CA), kad šis raktas priklauso šiam pavadinimui. Įprastas sertifikatas įrodo tik tai, kad užklausos teikėjas valdo domeno vardą (domeno patvirtinimas). Jis nieko nesako apie tai, kas Jūs esate ar ar esate patikimi.
Let's Encrypt yra nemokamas CA, išduodantis tik domeno lygiu patvirtintus sertifikatus, visiškai automatiškai per ACME protokolą. Programa Jūsų serveryje (ACME klientas) užsako sertifikatą, įrodo, kad valdo pavadinimą, jį įdiegia ir laiku atnaujina. Šioje pamokoje naudojamas certbot, EFF sukurtas klientas. Caddy (pamoka 7.4) turi įmontuotą ACME klientą.
Kaip įrodyti, kad valdote pavadinimą?
Let's Encrypt naudoja trijų rūšių iššūkius (challenges):
| Iššūkis | Kaip | Prievadas | Pakaitos simbolis (*.example.com) |
|---|---|---|---|
| HTTP-01 | patalpinti failą po http://<naam>/.well-known/acme-challenge/ | 80 | ne |
| DNS-01 | sukurti TXT įrašą _acme-challenge.<naam> | nėra | taip |
| TLS-ALPN-01 | parodyti specialų sertifikatą TLS rankos paspaudimo (handshake) metu | 443 | ne |
Įprastam VPS su svetaine paprasčiausias yra HTTP-01. Tam reikia, kad:
- pavadinimas A (ir AAAA) įrašu rodytų į Jūsų serverį (pamoka 7.1);
- 80 prievadas būtų atviras visam pasauliui, net jei Jūsų svetainė šiaip naudoja tik https. Let's Encrypt tikrina tik per 80 prievadą ir iš kelių vietų internete; šių adresų negalite įrašyti į savo užkardą;
- Jūsų serveris per IPv4 ir IPv6 atsakytų vienodai. Jei pavadinimas turi AAAA įrašą, Let's Encrypt pirmiausia bando IPv6. Tik jei per IPv6 ryšio visiškai nepavyksta užmegzti, jis grįžta prie IPv4.
DNS-01 Jums reikės pakaitos simbolio (wildcard) sertifikatui arba jei serveris nepasiekiamas iš išorės. Tada ACME klientas turi galėti keisti Jūsų DNS, dažniausiai per DNS paslaugų teikėjo API raktą. Šiuo raktu galima pakeisti visą Jūsų DNS: saugokite jį taip pat kruopščiai kaip slaptažodį.
certbot diegimas
certbot kūrėjai rekomenduoja snap, nes jame visada yra naujausia versija. Debian ir Ubuntu sistemose jį galima įdiegti ir tiesiog iš paketų saugyklos:
anna@web1:~$ sudo apt install certbot python3-certbot-nginxDistribucijos versija yra senesnė, bet saugumo atnaujinimus gauna per apt (pamokos 4.1 ir 4.2), o tai dera su likusia šio kurso dalimi. Pasirinkite vieną iš dviejų, ne abu: du įdiegimai vienas kitam trukdo atnaujinant.
Sertifikato užsakymas
Kai pamokos 7.2 svetainė jau veikia per 80 prievadą:
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 ir detalės pateiktos kaip pavyzdys.) Įskiepis --nginx atlieka tris dalykus: laikinai paruošia iššūkį, gauna sertifikatą ir pakeičia Jūsų server block, pridėdamas listen 443 ssl bloką ir nukreipimą iš http į https. Jei norite tai atlikti patys, naudokite certbot certonly --nginx ir eilutes į konfigūraciją įrašykite patys.
Keli dalykai, į kuriuos verta atkreipti dėmesį:
- Visus svetainei priklausančius pavadinimus užsakykite iš karto (
-dkiekvienam pavadinimui). Kiekvienas pavadinimas turi rodyti į serverį, kitaip nepavyks visa užklausa. - Privatusis raktas (
privkey.pem) yra/etc/letsencrypt/live/ir jį gali skaityti tik root. Nekopijuokite jo į kitas vietas ir niekada nedėkite į atsarginę kopiją, kurią gali skaityti kiti. - El. pašto adresas nėra privalomas. Nuo 2025 m. birželio Let's Encrypt nebesiunčia laiškų, kai sertifikato galiojimas baigiasi. Todėl Jūs patys turite stebėti, ar atnaujinimas pavyksta (pamoka 8.3).
http nukreipimas į https
Po certbot Jūsų konfigūracija atrodo maždaug taip (sutvarkyta; certbot pats prideda komentarus # managed by Certbot ir kartais if eilutes):
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;
...
}Pirmasis blokas viską, kas ateina per http, nuolatiniu nukreipimu (301) siunčia į tą patį pavadinimą ir tą patį kelią per https. Iššūkio failas atnaujinimui vis tiek veikia: Let's Encrypt seka tą nukreipimą. Antrasis blokas yra tikroji svetainė. Jei norite dar nukreipti www į pavadinimą be priešdėlio (arba atvirkščiai), darykite tai atskirame bloke, kad lankytojai matytų vieną pastovų pavadinimą.
Atnaujinimas: automatiškai ir su patikra
Let's Encrypt sertifikatas dabar galioja 90 dienų. Šis laikas trumpės: Let's Encrypt paskelbė, kad standartinis profilis nuo 2027 m. vasario 10 d. išduos 64 dienų, o nuo 2028 m. vasario 16 d. 45 dienų sertifikatus. Todėl atnaujinti rankiniu būdu nėra išeitis; tai turi vykti automatiškai.
Diegimo metu certbot sukuria systemd laikmatį (arba cron eilutę), kuris du kartus per dieną tikrina, ar sertifikatą reikia atnaujinti. Patikrinkite, ar jis yra, ir išbandykite atnaujinimą bandomąja užklausa:
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)Po atnaujinimo nginx turi įkelti ir naująjį sertifikatą. Su nginx įskiepiu certbot tai sutvarko pats; jei naudojate certonly, sukurkite deploy hook, kuris perkrauna nginx, pavyzdžiui, vykdomąjį scenarijų /etc/letsencrypt/renewal-hooks/deploy/ kataloge su systemctl reload nginx.
Geri ACME klientai naudoja ARI (ACME Renewal Information): tada Let's Encrypt pats nurodo, kada sertifikatą reikia atnaujinti, pavyzdžiui, anksčiau, jei kas nors negerai su tam tikra sertifikatų serija. Todėl nuolat atnaujinkite savo klientą.
Jei užklausa nepavyksta
| Pranešimas (sutrumpintas) | Priežastis | Sprendimas |
|---|---|---|
Timeout during connect (likely firewall problem) | 80 prievadas uždarytas arba pavadinimas rodo į kitą adresą | užkarda (pamoka 5.2), A/AAAA (pamoka 7.1) |
Invalid response from http://.../.well-known/acme-challenge/...: 404 | atsako kitas serveris arba kitas server block, dažnai per IPv6 | listen [::]:80, patikrinti AAAA įrašą |
CAA record for example.com prevents issuance | CAA įrašas leidžia tik kitą išdavėją | pakeisti CAA (pamoka 7.1) |
too many certificates already issued | užklausų limitas (rate limit) | palaukti; bandyti su staging |
Let's Encrypt taiko užklausų limitus (rate limits), kad būtų išvengta piktnaudžiavimo. Svarbiausi: ne daugiau kaip 50 naujų sertifikatų vienam registruotam domenui per 7 dienas, ne daugiau kaip 5 sertifikatai lygiai tam pačiam pavadinimų rinkiniui per 7 dienas ir ne daugiau kaip 5 nepavykę patvirtinimai vienam pavadinimui per valandą. Kas eksperimentuoja ir vis iš naujo teikia užklausas, greitai į juos atsitrenkia. Todėl bandykite su staging aplinka, kurios ribos daug platesnės, bet joje išduodamais sertifikatais naršyklės nepasitiki:
anna@web1:~$ sudo certbot certonly --nginx --staging -d test.example.comJei ten viskas veikia, užsakykite tikrąjį sertifikatą.
AlmaLinux ir Rocky Linux sistemose
Ten certbot gaunamas iš EPEL (dnf install certbot python3-certbot-nginx) arba kaip snap. Įskiepis ir komandos yra tokie patys. Nepamirškite firewalld (--add-service=http --add-service=https) ir SELinux, jei sertifikatai laikomi neįprastoje vietoje.
Praktikoje
Naudojant prieglobos paketą, sertifikatą už Jus sutvarko valdymo skydelis (WebOké ir kitose prieglobos įmonėse su DirectAdmin, cPanel ar Plesk). VPS serveryje tai darote patys, su certbot, Caddy arba ACME klientu, kuris pateikiamas su Jūsų programine įranga. Tai galioja pas bet kurį paslaugų teikėją.
Santrauka
- Let's Encrypt sertifikatas įrodo, kad valdote pavadinimą; certbot jį užsako, įdiegia ir atnaujina per ACME.
- HTTP-01 reikia visiems atviro 80 prievado ir vienodo atsakymo per IPv4 ir IPv6; DNS-01 skirtas pakaitos simbolio (wildcard) sertifikatams.
certbot --nginx -d ... -d ...sutvarko sertifikatą ir nukreipimą į https; visus svetainės pavadinimus užsakykite iš karto.- Sertifikatai dabar galioja 90 dienų ir šis laikas trumpės; patikrinkite laikmatį ir
certbot renew --dry-run, o galiojimo pabaigą stebėkite patys. - Bandykite su
--staging, kad išvengtumėte užklausų limitų; atkreipkite dėmesį į CAA.
Testas (quiz)
Užduotis
Užduotis Z7.3: https su galiojančiu sertifikatu. Užsakykite savo svetainei sertifikatą (su certbot arba Caddy), nukreipkite http į https ir išbandykite atnaujinimą su certbot renew --dry-run (naudojant Caddy: žurnaluose patikrinkite, ar sertifikatas buvo gautas). Įrašykite savo svetainės pavadinimą. Programa užmezga TLS ryšį su 443 prievadu ir patikrina, ar sertifikatas galioja, ar jį pasirašė patikimas išdavėjas ir ar jis apima Jūsų pavadinimą, o tada užklausia http://<naam>/, kad pamatytų, ar nukreipiate į https. Be to, nurodykite, kada baigiasi Jūsų sertifikato galiojimas ir kaip pas Jus sutvarkytas atnaujinimas.
Skaitykite daugiau
- SSL sertifikato aktyvavimas, atnaujinimas ir problemų sprendimas
- Nemokamas DNS kursas 5.2: CAA: kam leidžiama išduoti sertifikatus?
- 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
- Certbot instrukcijos (nginx): https://certbot.eff.org/instructions?ws=nginx&os=snap
