Modul 7 · 7.3
https a Let's Encrypt segítségével
Modul 7: Domain, webszerver és https · Olvasási idő: 12 perc
Tanulási cél: A lecke után Ön képes lesz certbottal ingyenes Let's Encrypt tanúsítványt igényelni nginx-hez, a http forgalmat https-re átirányítani, az automatikus megújítást ellenőrizni, és megoldani az igénylés leggyakoribb hibáit.
Kulcsfogalmak: tanúsítvány, tanúsítványkiadó (CA), ACME, Let's Encrypt, domainellenőrzés, HTTP-01, DNS-01, TLS-ALPN-01, certbot, megújítás, certbot renew --dry-run, érvényességi idő, ARI, rate limitek, staging, CAA, átirányítás https-re
Miért https, és mit bizonyít egy tanúsítvány
https nélkül minden titkosítatlanul halad a böngésző és a szerver között a hálózaton: jelszavak, űrlapok, sütik. Útközben bárki (egy nyilvános wifi, egy feltört router) beleolvashat vagy módosíthat valamit. A böngészők ezért a http-oldalakat „nem biztonságos” jelzéssel látják el, és bizonyos funkciók csak https-en keresztül működnek. Egy olyan jelszótárolónál, mint a Vaultwarden (9.4. lecke), a https egyenesen kötelező.
A https TLS-t használ, ehhez pedig a szerverének tanúsítványra van szüksége: egy olyan igazolásra, amelyet a böngészők által megbízhatónak tartott tanúsítványkiadó (CA) írt alá, és amely igazolja, hogy ez a kulcs ehhez a névhez tartozik. Egy hagyományos tanúsítvány csak azt bizonyítja, hogy az igénylő kezeli a domainnevet (domainellenőrzés). Arról semmit sem mond, hogy Ön kicsoda, vagy hogy megbízható-e.
A Let's Encrypt egy ingyenes CA, amely kizárólag domainellenőrzött tanúsítványokat ad ki, teljesen automatikusan, az ACME protokollon keresztül. A szerveren futó program (az ACME-kliens) igényli a tanúsítványt, bizonyítja, hogy kezeli a nevet, telepíti, és időben megújítja. Ez a lecke a certbotot, az EFF kliensét használja. A Caddy (7.4. lecke) beépített ACME-klienssel rendelkezik.
Hogyan bizonyítja, hogy Ön kezeli a nevet?
A Let's Encrypt háromféle kihívást (challenge) ismer:
| Kihívás | Hogyan | Port | Wildcard (*.example.com) |
|---|---|---|---|
| HTTP-01 | egy fájl elhelyezése a http://<naam>/.well-known/acme-challenge/ alatt | 80 | nem |
| DNS-01 | egy _acme-challenge.<naam> TXT-rekord beállítása | nincs | igen |
| TLS-ALPN-01 | egy speciális tanúsítvány bemutatása a TLS-kézfogás során | 443 | nem |
Egy weboldalt kiszolgáló hagyományos VPS esetén a HTTP-01 a legegyszerűbb. Ehhez a következők szükségesek:
- a név A (és AAAA) rekorddal a szerverére mutat (7.1. lecke);
- a 80-as port nyitva van az egész világ felé, akkor is, ha az oldal egyébként csak https-t használ. A Let's Encrypt kizárólag a 80-as porton keresztül ellenőriz, mégpedig az internet több pontjáról; ezeket a címeket nem tudja felvenni a tűzfalába;
- a szervere IPv4-en és IPv6-on is ugyanazt válaszolja. Ha a névnek van AAAA-rekordja, a Let's Encrypt először IPv6-ot próbál. Csak akkor tér vissza IPv4-re, ha IPv6-on egyáltalán nem jön létre kapcsolat.
A DNS-01 akkor szükséges, ha wildcard tanúsítványt szeretne, vagy ha a szerver kívülről nem érhető el. Ilyenkor az ACME-kliensnek módosítania kell tudnia a DNS-t, általában a DNS-szolgáltatója API-kulcsával. Ezzel a kulccsal a teljes DNS-e módosítható: ugyanolyan gondosan őrizze, mint egy jelszót.
A certbot telepítése
A certbot készítői a snap használatát javasolják, mert az mindig a legújabb verziót tartalmazza. Debianon és Ubuntun egyszerűen a csomagforrásból is telepíthető:
anna@web1:~$ sudo apt install certbot python3-certbot-nginxA disztribúció verziója régebbi, de az apt révén biztonsági frissítéseket kap (4.1. és 4.2. lecke), és ez illeszkedik a tanfolyam többi részéhez. A kettő közül csak az egyiket válassza, ne mindkettőt: két telepítés megújításkor zavarja egymást.
Tanúsítvány igénylése
Ha a 7.2. lecke oldala már működik a 80-as porton:
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(A dátum és a részletek csak példák.) A --nginx bővítmény három dolgot végez: ideiglenesen előkészíti a kihívást, letölti a tanúsítványt, és kiegészíti a server blockot egy listen 443 ssl blokkal, valamint egy http-ről https-re mutató átirányítással. Ha ezt inkább saját maga végezné el, használja a certbot certonly --nginx módot, és a sorokat Ön írja be a konfigurációba.
Néhány dolog, amire érdemes figyelni:
- Egyszerre igényelje az összes nevet, amely az oldalhoz tartozik (nevenként egy
-d). Minden névnek a szerverre kell mutatnia, különben az egész igénylés meghiúsul. - A privát kulcs (
privkey.pem) a/etc/letsencrypt/live/könyvtárban található, és csak a root olvashatja. Ne másolja máshová, és soha ne tegye olyan biztonsági mentésbe, amelyet mások is olvashatnak. - Az e-mail-cím megadása nem kötelező. A Let's Encrypt 2025 júniusa óta nem küld e-mailt, ha egy tanúsítvány hamarosan lejár. Önnek kell tehát felügyelnie, hogy a megújítás sikerül-e (8.3. lecke).
Átirányítás http-ről https-re
A certbot futtatása után a konfigurációja nagyjából így néz ki (letisztítva; a certbot maga is hozzáad # managed by Certbot megjegyzéseket és néha if sorokat):
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;
...
}Az első blok mindent, ami http-n érkezik, ugyanarra a névre és ugyanarra az útvonalra irányít át https-en, állandó átirányítással (301). A megújításhoz szükséges kihívásfájl továbbra is működik: a Let's Encrypt követi ezt az átirányítást. A második blok a tényleges oldal. Ha a www címet is a csupasz névre szeretné irányítani (vagy fordítva), ezt egy külön blokkban tegye meg, hogy a látogatók egyetlen állandó nevet lássanak.
Megújítás: automatikusan, ellenőrizve
Egy Let's Encrypt tanúsítvány jelenleg 90 napig érvényes. Ez rövidülni fog: a Let's Encrypt bejelentette, hogy az alapértelmezett profil 2027. február 10-től 64 napos, 2028. február 16-tól pedig 45 napos tanúsítványokat ad ki. A kézi megújítás tehát nem megoldás; automatikusan kell történnie.
A certbot a telepítéskor létrehoz egy systemd-időzítőt (vagy egy cron-sort), amely naponta kétszer megnézi, kell-e tanúsítványt megújítani. Ellenőrizze, hogy ez megvan-e, és tesztelje a megújítást egy próbaigényléssel:
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)A megújítás után az nginx-nek is be kell töltenie az új tanúsítványt. Az nginx-bővítménnyel a certbot ezt maga intézi; ha a certonly módot használja, hozzon létre egy deploy hookot, amely újratölti az nginx-et, például egy futtatható szkriptet a /etc/letsencrypt/renewal-hooks/deploy/ könyvtárban ezzel a tartalommal: systemctl reload nginx.
A jó ACME-kliensek használják az ARI-t (ACME Renewal Information): ilyenkor maga a Let's Encrypt jelzi, mikor kell egy tanúsítványt megújítani, például korábban, ha valami gond van tanúsítványok egy csoportjával. Ezért tartsa naprakészen a kliensét.
Ha egy igénylés meghiúsul
| Üzenet (rövidítve) | Ok | Megoldás |
|---|---|---|
Timeout during connect (likely firewall problem) | a 80-as port zárva van, vagy a név másik címre mutat | tűzfal (5.2. lecke), A/AAAA (7.1. lecke) |
Invalid response from http://.../.well-known/acme-challenge/...: 404 | egy másik szerver vagy másik server block válaszol, gyakran IPv6-on | listen [::]:80, az AAAA-rekord ellenőrzése |
CAA record for example.com prevents issuance | egy CAA-rekord csak másik kiadót engedélyez | a CAA módosítása (7.1. lecke) |
too many certificates already issued | egy rate limit | várakozás; tesztelés stagingben |
A Let's Encrypt a visszaélések megelőzésére rate limiteket (korlátokat) alkalmaz. A legfontosabbak: regisztrált domainenként 7 nap alatt legfeljebb 50 új tanúsítvány, pontosan ugyanarra a névkészletre 7 nap alatt legfeljebb 5 tanúsítvány, és nevenként óránként legfeljebb 5 sikertelen ellenőrzés. Aki kísérletezik, és újra meg újra igényel, hamar beleütközik ezekbe. Ezért teszteljen a staging környezetben, amelynek jóval tágabbak a korlátai, de olyan tanúsítványokat ad, amelyekben a böngészők nem bíznak meg:
anna@web1:~$ sudo certbot certonly --nginx --staging -d test.example.comHa ott működik, igényelje meg a valódi tanúsítványt.
AlmaLinuxon és Rocky Linuxon
Ott a certbot az EPEL-ből (dnf install certbot python3-certbot-nginx) vagy snapként érhető el. A bővítmény és a parancsok ugyanazok. Gondoljon a firewalld-re (--add-service=http --add-service=https), és a SELinuxra, ha a tanúsítványok szokatlan helyen vannak.
A gyakorlatban
Tárhelycsomagnál a panel intézi Ön helyett a tanúsítványt (a WebOké-nál és más, DirectAdmint, cPanelt vagy Pleskt használó tárhelyszolgáltatóknál is). Egy VPS-en Önnek kell elvégeznie, certbottal, Caddyvel vagy a szoftveréhez tartozó ACME-klienssel. Ez minden szolgáltatónál így van.
Összefoglalás
- Egy Let's Encrypt tanúsítvány azt bizonyítja, hogy Ön kezeli a nevet; a certbot az ACME-n keresztül igényli, telepíti és megújítja.
- A HTTP-01-hez mindenki számára nyitott 80-as port kell, és ugyanaz a válasz IPv4-en és IPv6-on; a DNS-01 a wildcardokhoz való.
- A
certbot --nginx -d ... -d ...intézi a tanúsítványt és a https-re irányítást; egy oldal összes nevét egyszerre igényelje. - A tanúsítványok jelenleg 90 napig érvényesek, és ez rövidülni fog; ellenőrizze az időzítőt és a
certbot renew --dry-runparancsot, és saját maga is figyelje a lejárati dátumot. - A rate limitek elkerülése érdekében teszteljen a
--stagingkapcsolóval; figyeljen a CAA-ra.
Kvíz
Feladat
Feladat Z7.3: https érvényes tanúsítvánnyal. Igényeljen tanúsítványt az oldalához (certbottal vagy Caddyvel), irányítsa át a http-t https-re, és tesztelje a megújítást a certbot renew --dry-run paranccsal (Caddy esetén: nézze meg a naplókban, hogy a tanúsítvány letöltődött-e). Adja meg az oldala nevét. A program TLS-kapcsolatot létesít a 443-as portra, és ellenőrzi, hogy a tanúsítvány érvényes-e, megbízható kiadó írta-e alá, és lefedi-e az Ön nevét, majd lekéri a http://<naam>/ címet, hogy lássa, átirányít-e https-re. Ezenkívül adja meg, mikor jár le a tanúsítványa, és hogyan van megoldva Önnél a megújítás.
További olvasnivaló
- SSL-tanúsítvány aktiválása, megújítása és hibaelhárítás
- Ingyenes DNS-tanfolyam 5.2: CAA: ki adhat ki tanúsítványokat?
- 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-útmutató (nginx): https://certbot.eff.org/instructions?ws=nginx&os=snap
