zranitelnost.cz

Návod · oblast 02 · Certifikáty a šifrování

Certifikáty a TLS: jak zařídit HTTPS, které nevyprší

Propadlý certifikát je nejrychlejší způsob, jak zavřít vlastní web. Nefunguje po něm nic: ani e-shop, ani přihlášení, ani aplikace, která si sahá pro data na vaše API. Zároveň je to jediná bezpečnostní chyba, kterou lze vyřešit jednou provždy — nastavit obnovu tak, aby běžela bez vás, a pak ověřit, že opravdu běží. Tenhle návod vás tím provede, včetně věcí, které se v posledních dvou letech změnily.

aktualizováno 24. 9. 2026 · čtení na 10 minut · hotové konfigurace pro nginx, Apache i Caddy

Proč to řešit

Protože výpadek je okamžitý a úplný. Chyba certifikátu není kosmetická vada. Prohlížeč místo vaší stránky ukáže celoobrazovkové varování a návštěvník se k obsahu nedostane. A pokud máte nastavené HSTS (a měli byste), nezobrazí se mu ani tlačítko „pokračovat přesto“ — ta možnost je záměrně pryč. Zákazník zavře záložku a jde jinam.

Protože to padá tam, kam nikdo nekouká. Na hlavní doméně bývá obnova vyřešená. Certifikát propadá na api., mail., staging. nebo na starém webu, který někdo před třemi lety přesunul na subdoménu. Tedy přesně na tom, co jsme vypsali v oblasti 01 a na co si nikdo nevzpomene, dokud to nespadne.

A protože ruční obnova právě přestává být udržitelná. Sdružení CA/Browser Forum, ve kterém se domlouvají certifikační autority s prohlížeči, schválilo postupné zkracování platnosti certifikátů: od března 2026 platí nově vydané nanejvýš 200 dní, od března 2027 to bude 100 dní a od března 2029 jen 47 dní. Kdo dnes obnovuje ručně jednou za rok, bude to za tři roky dělat osmkrát ročně. U jedné domény to ještě jde odsedět, u pěti to nikdo dělat nebude.

tohle se plete nejčastěji

Certifikát zdarma není horší certifikát. Ten od Let’s Encrypt šifruje úplně stejně jako placený za tři tisíce ročně a prohlížeč mezi nimi nedělá žádný rozdíl. Za peníze se kupuje ověření firmy, podpora a pojištění, ne silnější šifrování. A platí to i obráceně: zámeček v adresním řádku neznamená, že je web bezpečný. Znamená jen, že spojení nikdo cestou nečte — certifikát má dnes i každá phishingová stránka.

Čtyři poruchy, které sken najde

V oblasti „Certifikáty a šifrování“ hlásíme tohle. Každá porucha má jinou příčinu i jinou naléhavost, ale tři ze čtyř mají stejné řešení — automatizaci, o které je zbytek návodu:

Certifikát vypršel / brzy vypršíplatnost
Nejčastější a zároveň nejzbytečnější porucha. Sken hlásí varování čtrnáct dní předem a kritický nález ve chvíli, kdy je po termínu. Do té doby web funguje úplně normálně, takže si toho nikdo nevšimne — a pak ze vteřiny na vteřinu přestane fungovat všechno naráz.
Certifikát neodpovídá doméněnázvy
Certifikát platí jen pro názvy, které jsou v něm vypsané. Klasika je certifikát na vase-firma.cz, který neplatí pro www.vase-firma.cz — a přitom právě na tu variantu vedou staré odkazy i výsledky ve vyhledávání. Stejně tak se zapomíná na api., eshop. nebo kalendar.
Certifikát není důvěryhodnýřetěz
Nejzákeřnější z celé čtveřice, protože ve vašem prohlížeči na počítači vypadá všechno v pořádku. Server totiž musí poslat i mezilehlý certifikát autority. Když ho nepošle, desktopový Chrome si ho většinou domyslí z dřívějška, jenže Android, platební brána a jakýkoli skript s curlem spojení odmítnou.
Zastaralý protokolTLS 1.0 a 1.1
Verze, které prohlížeče vyřadily už v roce 2020. Dnes je potkáváme skoro výhradně na zapomenutých subdoménách a interních nástrojích, které nikdo od instalace nekonfiguroval. Že je někdo v prohlížeči neotevře, není ochrana — útočníkovi prohlížeč nikdo nepředepsal.

A k tomu pátá věc, kterou certifikát sám nevyřeší: stránka, která se sice načte přes HTTPS, ale tahá si z nešifrovaných adres obrázky nebo skripty. Tomu se říká smíšený obsah a věnuje se mu poslední krok.

krok 1

Zjistěte, co server posílá teď

Nejrychleji přes bezplatný sken na této stránce: oblast „Certifikáty a šifrování“ ukáže, kolik dní zbývá do expirace, jestli certifikát platí pro vaši doménu a jakou verzí protokolu se server domluvil. V terminálu zjistíte totéž a ještě o kus víc:

terminál

openssl s_client -connect vase-firma.cz:443 -servername vase-firma.cz </dev/null 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates -ext subjectAltName

Zajímá vás notAfter (do kdy platí), řádek issuer (kdo ho vydal) a hlavně výpis subjectAltName — to je úplný seznam názvů, pro které certifikát platí.

Pusťte to na víc adresách než na jedné. Kromě hlavní domény určitě na variantu s www, na API i na subdomény, které vám vypsal sken. Každá z nich může mít vlastní certifikát, vlastní server a vlastní datum expirace.

krok 2

Zapněte obnovu, která běží bez vás

Cíl je jediný: nikdy už na certifikát nesahat rukou. Vyberte si cestu podle toho, kde web běží.

Vlastní server s nginxem nebo Apachem. Standardem je certbot, který certifikát vystaví i zapíše do konfigurace sám:

terminál · první vystavení

sudo certbot --nginx -d vase-firma.cz -d www.vase-firma.cz

Pro Apache totéž s --apache. Vypište za -d všechny názvy, na kterých má web odpovídat; přidat další jde kdykoli znovu.

Caddy. Nedělá se nic. Certifikát si vystaví i obnovuje sám od začátku, stačí mít v konfiguraci správný název domény a otevřené porty 80 a 443.

Sdílený hosting nebo administrace poskytovatele. Hledejte v panelu položku „SSL“ nebo „Certifikáty“ a přepínač automatické obnovy. Bývá vypnutý u domén, které se na hosting přidaly později. Zaškrtněte ho u každé domény i subdomény zvlášť, hromadně to obvykle nejde.

Web za CDN nebo proxy. Tam je potřeba myslet na dva certifikáty, ne na jeden: ten veřejný na straně CDN a ten na vašem serveru, kam CDN sahá. Certifikát na serveru vidíte v prohlížeči i ve skenu jen tehdy, když se zeptáte na přímou adresu, a právě proto se na něj zapomíná nejčastěji.

Potřebujete-li pokrýt certifikátem všechny subdomény najednou (*.vase-firma.cz), počítejte s tím, že se vystavuje přes DNS záznam, ne přes soubor na webu — certbot k tomu potřebuje plugin na vašeho DNS poskytovatele a API token. U pěti známých subdomén je jednodušší vypsat je za -d.

krok 3

Ověřte, že obnova opravdu proběhne — a že se služba přenačte

Tohle je ten krok, který se přeskakuje, a přitom právě on dělá rozdíl mezi automatizací a její iluzí. Nejčastější příčina propadlého certifikátu totiž není zapomenutá obnova, ale obnova, po které nikdo nepřenačetl webserver: nový soubor leží na disku, jenže nginx posílá pořád ten starý, který si načetl při startu.

terminál · nanečisto, bez zásahu do ostrého certifikátu

sudo certbot renew --dry-run
systemctl list-timers | grep certbot

První příkaz musí projít bez chyby, druhý musí ukázat naplánovaný časovač. Když druhý příkaz nevypíše nic, obnova nikde nečeká a certifikát vyprší.

Reload po obnově se zařídí jednou provždy hookem. Certbot spouští po každé úspěšné obnově všechno, co najde ve složce /etc/letsencrypt/renewal-hooks/deploy/:

/etc/letsencrypt/renewal-hooks/deploy/reload.sh

#!/bin/sh
systemctl reload nginx

Nezapomeňte chmod +x. Běží to jen po skutečné obnově, ne při každém pokusu. Kromě webserveru sem patří i všechno ostatní, co ten certifikát používá — poštovní server, databáze, API služba.

Zkoušku nadvakrát uděláte příkazem sudo certbot renew --force-renewal a hned poté prvním příkazem z kroku 1. Když se datum expirace posunulo i navenek, máte hotovo doopravdy.

krok 4

Pokryjte všechny názvy, na kterých web odpovídá

Certifikát platí pro názvy vypsané ve svém subjectAltName, a pro žádné jiné. Projděte si výpis z prvního kroku a porovnejte ho se seznamem subdomén ze skenu. Typicky chybí:

  • varianta s www (nebo naopak doména bez ní),
  • subdomény, které vznikly později — api, eshop, kalendar,
  • doména v jiné koncovce, kterou máte zaregistrovanou obranně a přesměrováváte ji,
  • poštovní server, pokud klienti chodí na mail.vase-firma.cz.

Přesměrování problém neřeší. K přesměrování totiž dojde až po navázání šifrovaného spojení, takže varování v prohlížeči naskočí dřív, než se návštěvník stihne dostat na správnou adresu.

krok 5

Pošlete celý řetěz a vypněte staré protokoly

Server musí kromě vlastního certifikátu poslat i mezilehlý certifikát autority. Právě tenhle rozdíl je za většinou nálezů „certifikát není důvěryhodný“ a pozná se tím, že web funguje v Chromu na počítači, ale ne na telefonu nebo v curlu. V konfiguraci proto patří vždycky fullchain.pem, nikdy ne samotný cert.pem:

nginx · do server bloku

ssl_certificate     /etc/letsencrypt/live/vase-firma.cz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vase-firma.cz/privkey.pem;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;

Apache · konfigurace virtuálního hostu

SSLEngine on
SSLCertificateFile    /etc/letsencrypt/live/vase-firma.cz/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vase-firma.cz/privkey.pem

SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLHonorCipherOrder off

Po zásahu do konfigurace vždycky nejdřív nginx -t, případně apachectl configtest, teprve potom reload. Překlep v cestě k certifikátu jinak shodí celý web, ne jen jednu doménu.

Ponechat TLS 1.2 a 1.3 je dnes bezpečná volba i pro zákazníky se starými zařízeními; návštěvníka, kterému by tohle nastavení web zavřelo, byste hledali dlouho. Výchozí sada šifer v obou serverech je v pořádku, vlastní seznam z nějakého deset let starého návodu bývá horší než žádný.

Ověření je jednoduché: v úplném výpisu openssl s_client se musí objevit řádek Verify return code: 0 (ok) a v seznamu poslaných certifikátů dva kusy, ne jeden.

co už z návodů vyškrtněte

OCSP stapling. Starší postupy ho doporučují zapnout, jenže Let’s Encrypt v roce 2025 podporu OCSP ukončil a jeho certifikáty už adresu takového ověřovatele vůbec neobsahují. Direktiva ssl_stapling on; tam pak jen zbytečně straší v logu. Odvolávání certifikátů dnes řeší prohlížeče vlastními seznamy a hlavně krátká platnost.

krok 6

Zbytek cesty: nešifrované adresy a hlídání expirace

Když certifikát sedí, zbývají dvě díry, kterými se ta šifrovaná cesta pořád dá obejít. První je web, který odpovídá i na http:// — to patří do návodu k bezpečnostním hlavičkám, kde je hotové přesměrování i HSTS. Druhá je smíšený obsah: stránka jede po HTTPS, ale obrázek, písmo nebo skript v ní míří na starou nešifrovanou adresu. Skripty prohlížeč rovnou zablokuje, takže se obvykle rozbije zrovna to, co vydělává.

jak smíšený obsah najít

curl -s https://vase-firma.cz | grep -oE 'http://[a-zA-Z0-9./_-]+' | sort -u

Totéž ukáže konzole prohlížeče hláškou „Mixed Content“. Nejčastěji to bývají obrázky nahrané do redakčního systému s absolutní adresou — v databázi je pak potřeba hromadná náhrada http:// za https://.

A nakonec hlídání. Let’s Encrypt od června 2025 e-maily o blížící se expiraci neposílá vůbec, takže se na ně nedá spoléhat ani jako na poslední záchranu. Hlídat to musí něco, co nezapomíná: monitoring, který jednou denně zkontroluje datum z certifikátu, nebo naše pravidelná kontrola, která vám blížící se expiraci vypíše v měsíčním reportu spolu se zbytkem změn.

bonus na pět minut

Přidejte si do DNS záznam CAA. Určuje, která certifikační autorita vůbec smí pro vaši doménu certifikát vydat — ostatní to mají zakázané a žádost odmítnou. Zápis vypadá takhle: vase-firma.cz. CAA 0 issue "letsencrypt.org" a k tomu 0 iodef "mailto:security@vase-firma.cz", kam pak přijde upozornění na odmítnutou žádost. Je to jedna z mála obran proti tomu, aby si někdo vystavil platný certifikát na vaši doménu jinde. Jestli ho máte, uvidíte ve skenu v oblasti „DNS a e-mail“ — chybějící CAA tam hlásíme jako informativní nález.

Pět chyb, které v kontrolách vidíme nejčastěji

V konfiguraci je cert.pem místo fullchain.pem

Jeden znak v cestě a server přestane posílat mezilehlý certifikát. Na vašem počítači to funguje dál, takže si problému nikdo nevšimne — ohlásí se až zákazník s Androidem nebo dodavatel, kterému přestalo chodit API. Do nginxu i Apache patří vždycky fullchain.

Obnova proběhla, ale nikdo nepřenačetl službu

Nejčastější příčina propadlého certifikátu, na jakou narážíme. Nový soubor v /etc/letsencrypt normálně leží na disku, jenže nginx si ten starý drží v paměti od posledního startu a bude ho posílat do konce světa. Bez hooku, který po obnově udělá reload, je automatizace jen napůl.

Certifikát jen na apexu, varianta s www bez něj

Nebo naopak. Stačí, že se před lety přidávala jen jedna z adres a druhá se dneska přesměrovává. Jenže přesměrování z www proběhne až po navázání šifrovaného spojení — takže než na něj dojde, uvidí návštěvník varování.

Expiraci hlídá jeden člověk v kalendáři

Funguje to přesně do chvíle, než je ten člověk na dovolené, nemocný nebo než mu skončí smlouva. A na záchrannou síť v podobě e-mailu od autority se spolehnout nedá, jak je popsané v kroku 6. Hlídání patří stroji, ne kalendáři.

„Je to jenom testovací server“

Self-signed certifikát nebo TLS 1.0 na veřejně dostupné subdoméně. Pro útočníka je to plnohodnotný vstup do vaší infrastruktury a pro vaše lidi škola toho, že varování v prohlížeči se odklepává. Buď to schovejte za VPN, nebo tomu dejte normální certifikát — je zadarmo.

Nechte si s tím poradit

Zapnout obnovu je práce na půl hodiny, jenže každý hosting a každý server to má jinak. Doplňte si do následujícího promptu, kde váš web běží, přiložte výstup z prvního kroku a nechte si postup připravit na míru — v ChatGPT, Claude, nebo kdekoli jinde. Stejné prompty přikládáme u nálezů v placeném reportu.

AI prompt · zkopírujte do ChatGPT nebo Claude

Provozuji web vase-firma.cz. Běží na [nginx / Apache / Caddy / sdílený hosting bez přístupu ke konfiguraci] a certifikát mám od [Let's Encrypt / jiná autorita / od hostingu]. Tady je, co vrací příkaz openssl s_client -connect vase-firma.cz:443 -servername vase-firma.cz </dev/null: [vlož výstup]. Chci, aby se certifikát obnovoval sám a aby se po obnově automaticky přenačetl webserver. Napiš mi: 1) jak ověřím, jestli je obnova vůbec nastavená a jestli poslední pokus dopadl dobře, 2) kompletní konfiguraci se správnou cestou k celému řetězu certifikátů a s povolenými jen verzemi TLS 1.2 a 1.3, 3) jak do certifikátu dostanu i variantu s www a tyhle subdomény: [vyjmenuj], 4) čím si po nasazení ověřím, že řetěz sedí i na Androidu a v curlu, ne jen v mém prohlížeči. Pokud mi budeš doporučovat OCSP stapling, napiš rovnou, jestli ho moje certifikační autorita ještě podporuje.

Konfiguraci před reloadem vždycky nechte ověřit příkazem nginx -t. Jazykový model občas nabídne direktivu z jiné verze serveru a chyba v bloku s certifikátem neshodí jen jednu stránku, ale celý web.

Kdy vyprší certifikát vašeho webu?

Zadejte doménu a během chvíle uvidíte, kolik dní zbývá, jestli certifikát platí pro všechny vaše názvy a jakou verzí TLS se server domlouvá. Spolu s dalšími pěti oblastmi — subdoménami, DNS, hlavičkami i otevřenými soubory. Zdarma a bez registrace.