Přejít na obsah

Nastavení cookies

Zvolte, které druhy cookies povolíte. Svou volbu můžete kdykoli změnit přes Nastavení cookies v dolní části každé stránky. Prohlášení o ochraně osobních údajů

Nezbytné

Vždy zapnuté

Potřebné pro přihlášení, uchování košíku a zapamatování vašich voleb. Jsou vždy zapnuté.

Které cookies?
  • weboke_sessie, weboke_klant, weboke_remember: vaše relace a trvalé přihlášení
  • weboke_basket: váš košík
  • wkBtwIncl: zobrazení cen s DPH nebo bez DPH
  • wok_cookies: vaše volba cookies, 12 měsíců

Měří, která reklama vede k návštěvě nebo objednávce, abychom neplatili za reklamy, které nic nepřinášejí.

Které cookies?
  • Google Ads přes Google Tag Manager (_gcl_au, _gcl_aw), až 90 dní
  • OpenAI Ads, reklamy v ChatGPT
  • wok_aff: partner, který vás k nám doporučil (partnerský program), 60 dní

4,6

Země a jazyk

Každá země má vlastní web s cenami a DPH dané země.

Zobrazit

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ýzvaJakPortWildcard (*.example.com)
HTTP-01umístit soubor pod http://<naam>/.well-known/acme-challenge/80ne
DNS-01nastavit TXT záznam _acme-challenge.<naam>žádnýano
TLS-ALPN-01předložit speciální certifikát během TLS handshake443ne

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-nginx

Verze 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ří (-d pro 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 adresufirewall (lekce 5.2), A/AAAA (lekce 7.1)
Invalid response from http://.../.well-known/acme-challenge/...: 404odpovídá jiný server nebo jiný server block, často přes IPv6listen [::]:80, zkontrolovat záznam AAAA
CAA record for example.com prevents issuancezáznam CAA povoluje jen jinou autorituupravit CAA (lekce 7.1)
too many certificates already issuedrate limitpoč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.com

Když 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-run a sami hlídejte datum vypršení.
  • Testujte s --staging, abyste se vyhnuli rate limits; pozor na CAA.

Kvíz

1. Váš web má být dostupný pouze přes https. Smíte pak ve firewallu zavřít port 80, pokud používáte HTTP-01?



2. Chcete certifikát pro *.example.com. Jakou výzvu potřebujete?



3. Žádost selže s chybou 404 u souboru výzvy, přestože curl http://example.com/ přes IPv4 zobrazí Váš web. Jaká je nejpravděpodobnější příčina?



4. Proč je automatická obnova důležitější než kdy dříve?



5. Experimentujete a dnes jste už čtyřikrát požádali o stejný certifikát. Co uděláte před dalším pokusem?



Ú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.

Úkol Z7.3: https s platným certifikátem

Pouze pro přihlášené účastníky kurzu. Otevřeme https://<naam>/ a http://<naam>/ jako prohlížeč, z našeho webového serveru.




Co vyplníte a co zjistíme, neukládáme. Váš prohlížeč si pamatuje Vaše odpovědi a to, zda jste úkol splnili. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol měli (téměř) správně; i to tam můžete odstranit.

Doporučujeme k přečtení

Chvíli strpení…

Nastavení vašich domén

U každé domény nastavte jmenné servery, propojení s hostingem a to, kdo bude držitelem.

Načítání vašich domén…