https s Let's Encrypt
Modul 7: Doména, webový server a https · Doba čtení: 12 min.
Cíl lekce: Po této lekci budete umět pomocí certbot získat bezplatný certifikát od Let's Encrypt pro nginx, nastavit přesměrování z http na https, zkontrolovat automatickou obnovu a vyřešit nejčastější chyby při žádosti o certifikát.
Klíčové pojmy: certifikát, certifikační autorita (CA), ACME, Let's Encrypt, ověření domény, HTTP-01, DNS-01, TLS-ALPN-01, certbot, obnova, certbot renew --dry-run, doba platnosti, ARI, rate limits, staging, CAA, přesměrování na https
Proč https a co certifikát dokazuje
Bez https putuje vše mezi prohlížečem a serverem po síti nešifrovaně: hesla, formuláře, cookies. Kdokoli po cestě (veřejná wifi, napadený router) může data číst nebo měnit. Prohlížeče proto označují weby na http jako "nezabezpečené" a některé funkce fungují jen přes https. Pro trezor hesel, jako je Vaultwarden (lekce 9.4), je https dokonce povinné.
https používá TLS a k tomu Váš server potřebuje certifikát: doklad podepsaný certifikační autoritou (CA), které prohlížeče důvěřují, že tento klíč patří k tomuto názvu. Běžný certifikát dokazuje pouze to, že žadatel spravuje doménové jméno (ověření domény). Neříká nic o tom, kdo jste ani zda jste důvěryhodní.
Let's Encrypt je bezplatná CA, která vydává pouze certifikáty s ověřením domény, a to plně automaticky pomocí protokolu ACME. Program na Vašem serveru (ACME klient) o certifikát požádá, prokáže, že název spravuje, certifikát nainstaluje a včas ho obnoví. V této lekci používáme certbot, klienta od EFF. Caddy (lekce 7.4) má ACME klienta vestavěného.
Jak prokázat, že název spravujete?
Let's Encrypt zná tři druhy výzev (challenges):
| Výzva | Jak | Port | Wildcard (*.example.com) |
|---|---|---|---|
| HTTP-01 | umístit soubor pod http://<naam>/.well-known/acme-challenge/ | 80 | ne |
| DNS-01 | nastavit TXT záznam _acme-challenge.<naam> | žádný | ano |
| TLS-ALPN-01 | předložit speciální certifikát během TLS handshake | 443 | ne |
Pro běžný VPS s webem je nejjednodušší HTTP-01. K tomu je potřeba, aby:
- název ukazoval záznamem A (a AAAA) na Váš server (lekce 7.1);
- byl port 80 otevřený pro celý svět, i když Váš web jinak používá jen https. Let's Encrypt ověřuje pouze přes port 80 a z více míst na internetu; tyto adresy nemůžete povolit ve firewallu;
- Váš server odpovídal přes IPv4 i IPv6 stejně. Pokud má název záznam AAAA, zkusí Let's Encrypt nejdříve IPv6. Teprve když se přes IPv6 vůbec nepodaří navázat spojení, přejde na IPv4.
DNS-01 potřebujete pro wildcard certifikát, nebo když server není zvenku dostupný. ACME klient pak musí umět upravovat Vaše DNS, obvykle pomocí API klíče od Vašeho poskytovatele DNS. Tímto klíčem lze změnit celé Vaše DNS: uchovávejte ho stejně pečlivě jako heslo.
Instalace certbot
Autoři certbot doporučují snap, protože má vždy nejnovější verzi. Na Debianu a Ubuntu ho lze nainstalovat i normálně z repozitáře balíčků:
anna@web1:~$ sudo apt install certbot python3-certbot-nginxVerze z distribuce je starší, ale dostává bezpečnostní aktualizace přes apt (lekce 4.1 a 4.2), což odpovídá zbytku tohoto kurzu. Zvolte jednu z obou možností, ne obě: dvě instalace by si při obnově navzájem překážely.
Žádost o certifikát
S webem z lekce 7.2, který už běží na portu 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(Datum a podrobnosti jsou jen příklad.) Plug-in --nginx udělá tři věci: dočasně připraví výzvu, stáhne certifikát a upraví Váš server block o blok listen 443 ssl a přesměrování z http na https. Pokud to chcete udělat raději sami, použijte certbot certonly --nginx a doplňte řádky do konfigurace ručně.
Na co si dát pozor:
- Požádejte najednou o všechny názvy, které k webu patří (
-dpro každý název). Každý název musí ukazovat na server, jinak selže celá žádost. - Soukromý klíč (
privkey.pem) je uložen v/etc/letsencrypt/live/a může ho číst jen root. Nekopírujte ho jinam a nikdy ho nedávejte do zálohy, kterou mohou číst jiní. - E-mailová adresa je nepovinná. Let's Encrypt od června 2025 neposílá e-maily, když certifikát brzy vyprší. Musíte tedy sami hlídat, že obnova funguje (lekce 8.3).
Přesměrování z http na https
Po spuštění certbot vypadá Vaše konfigurace zhruba takto (zjednodušeno; certbot sám přidává komentáře # managed by Certbot a někdy řádky 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;
...
}První blok přesměruje vše z http na stejný název a stejnou cestu přes https, a to trvalým přesměrováním (301). Soubor výzvy pro obnovu funguje i nadále: Let's Encrypt přesměrování následuje. Druhý blok je samotný web. Pokud chcete navíc přesměrovat www na holý název (nebo naopak), udělejte to ve vlastním bloku, aby návštěvníci viděli jeden pevný název.
Obnova: automaticky a pod kontrolou
Certifikát od Let's Encrypt je nyní platný 90 dní. Tato doba se zkracuje: Let's Encrypt oznámil, že standardní profil bude od 10. února 2027 vydávat certifikáty na 64 dní a od 16. února 2028 na 45 dní. Ruční obnova tedy nepřichází v úvahu; musí probíhat automaticky.
certbot při instalaci nastaví systemd timer (nebo řádek v cronu), který dvakrát denně zkontroluje, zda je potřeba certifikát obnovit. Ověřte, že tam je, a vyzkoušejte obnovu zkušební žádostí:
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 obnově musí nginx nový certifikát také načíst. S plug-inem pro nginx to certbot zařídí sám; pokud používáte certonly, nastavte deploy hook, který nginx znovu načte, například spustitelný skript v /etc/letsencrypt/renewal-hooks/deploy/ s systemctl reload nginx.
Dobří ACME klienti používají ARI (ACME Renewal Information): Let's Encrypt pak sám určí, kdy je potřeba certifikát obnovit, například dříve, když je problém s nějakou sérií certifikátů. Udržujte proto svého klienta aktuální.
Když žádost selže
| Hlášení (zkráceno) | Příčina | Řešení |
|---|---|---|
Timeout during connect (likely firewall problem) | port 80 je zavřený nebo název ukazuje na jinou adresu | firewall (lekce 5.2), A/AAAA (lekce 7.1) |
Invalid response from http://.../.well-known/acme-challenge/...: 404 | odpovídá jiný server nebo jiný server block, často přes IPv6 | listen [::]:80, zkontrolovat záznam AAAA |
CAA record for example.com prevents issuance | záznam CAA povoluje jen jinou autoritu | upravit CAA (lekce 7.1) |
too many certificates already issued | rate limit | počkat; testovat se staging |
Let's Encrypt má rate limits, které brání zneužití. Nejdůležitější z nich: nejvýše 50 nových certifikátů na registrovanou doménu za 7 dní, nejvýše 5 certifikátů pro přesně stejnou sadu názvů za 7 dní a nejvýše 5 neúspěšných ověření na název za hodinu. Kdo zkouší a žádá stále znovu, rychle na ně narazí. Testujte proto v prostředí staging, které má mnohem volnější limity, ale vydává certifikáty, kterým prohlížeče nedůvěřují:
anna@web1:~$ sudo certbot certonly --nginx --staging -d test.example.comKdyž to tam funguje, požádejte o skutečný certifikát.
Na AlmaLinux a Rocky Linux
certbot tam získáte z EPEL (dnf install certbot python3-certbot-nginx) nebo jako snap. Plug-in i příkazy jsou stejné. Pamatujte na firewalld (--add-service=http --add-service=https) a na SELinux, pokud jsou certifikáty uloženy na neobvyklém místě.
V praxi
U hostingového balíčku se o certifikát postará panel (u WebOké i u jiných hostingových společností s DirectAdmin, cPanel nebo Plesk). Na VPS to děláte sami, pomocí certbot, Caddy nebo ACME klienta, který patří k Vašemu softwaru. To platí u každého poskytovatele.
Shrnutí
- Certifikát od Let's Encrypt dokazuje, že název spravujete; certbot o něj požádá, nainstaluje ho a obnovuje přes ACME.
- HTTP-01 potřebuje otevřený port 80 pro všechny a stejnou odpověď přes IPv4 i IPv6; DNS-01 slouží pro wildcardy.
certbot --nginx -d ... -d ...zařídí certifikát i přesměrování na https; požádejte o všechny názvy webu najednou.- Certifikáty jsou nyní platné 90 dní a jejich platnost se zkracuje; kontrolujte timer a
certbot renew --dry-runa sami hlídejte datum vypršení. - Testujte s
--staging, abyste se vyhnuli rate limits; pozor na CAA.
Kvíz
Úkol
Úkol Z7.3: https s platným certifikátem. Požádejte pro svůj web o certifikát (pomocí certbot nebo Caddy), přesměrujte http na https a vyzkoušejte obnovu pomocí certbot renew --dry-run (u Caddy: zkontrolujte v logu, zda byl certifikát stažen). Zadejte název svého webu. Program naváže TLS spojení na port 443 a ověří, zda je certifikát platný, podepsaný důvěryhodnou autoritou a pokrývá Váš název, a poté načte http://<naam>/, aby zjistil, zda přesměrováváte na https. Kromě toho uvedete, kdy Váš certifikát vyprší a jak máte obnovu zajištěnou.
Doporučujeme k přečtení
- Aktivace, obnova a řešení problémů s SSL certifikátem
- Bezplatný DNS kurz 5.2: CAA: kdo smí vydávat certifikáty?
- 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
- Návod pro Certbot (nginx): https://certbot.eff.org/instructions?ws=nginx&os=snap
