Servery a DevOps

HTTPS zdarma: Let's Encrypt a certbot s nginx na Ubuntu

Získejte certifikát Let's Encrypt přes certbot, nastavte přesměrování na HTTPS, ověřte automatickou obnovu a vyřešte nejčastější chyby validace.

12. 10. 2026 · 4 min čtení

Let’s Encrypt vydává bezplatné TLS certifikáty a certbot je nástroj, který je umí získat, nainstalovat do nginx a automaticky obnovovat. Celé nastavení HTTPS tak zvládnete za pár minut. Projdeme instalaci, obnovu, wildcard certifikáty i řešení chyb.

Předpoklady

  • Doména má A záznam (případně AAAA) směřující na IP serveru. Ověřte: dig +short mojeapp.cz.
  • Port 80 je otevřený z internetu – certbot ho používá pro ověření (HTTP-01 challenge).
  • Nginx má server blok se správným server_name.
sudo ufw allow 'Nginx Full'

Instalace certbotu

Projekt certbot doporučuje instalaci přes snap:

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Alternativně z repozitáře Ubuntu (může být starší verze, ale funguje dobře):

sudo apt install certbot python3-certbot-nginx

Nepoužívejte obě varianty současně.

Získání certifikátu

sudo certbot --nginx -d mojeapp.cz -d www.mojeapp.cz

Při prvním spuštění zadáte e-mail a souhlas s podmínkami. Certbot:

  1. ověří, že doménu ovládáte,
  2. uloží certifikát do /etc/letsencrypt/live/mojeapp.cz/,
  3. upraví váš server blok – přidá listen 443 ssl, cesty k certifikátu a přesměrování z HTTP na HTTPS.

Výsledek ověřte:

curl -I https://mojeapp.cz
sudo certbot certificates

Jen certifikát, konfiguraci si napíšu sám

Pokud nechcete, aby certbot sahal do konfigurace:

sudo certbot certonly --nginx -d mojeapp.cz

V nginx pak použijte:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name mojeapp.cz;

    ssl_certificate     /etc/letsencrypt/live/mojeapp.cz/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mojeapp.cz/privkey.pem;

    # ... location bloky
}

server {
    listen 80;
    listen [::]:80;
    server_name mojeapp.cz;
    return 301 https://$host$request_uri;
}

Direktiva http2 on; funguje od nginx 1.25.1. Ubuntu 24.04 má nginx 1.24, kde se HTTP/2 zapíná starším zápisem listen 443 ssl http2;.

Vždy používejte fullchain.pem, ne cert.pem – jinak bude chybět mezilehlý certifikát a některé klienty (hlavně starší Android nebo curl) spojení odmítnou.

Automatická obnova

Certifikáty Let’s Encrypt platí 90 dní. Certbot instaluje časovač, který obnovu zkouší dvakrát denně a obnoví certifikát, když se blíží konec platnosti.

systemctl list-timers | grep certbot

U snap instalace se časovač jmenuje snap.certbot.renew.timer, u apt verze certbot.timer.

Otestujte obnovu nanečisto:

sudo certbot renew --dry-run

Pokud projde, máte vyřešeno. Při obnově v režimu --nginx certbot nginx sám znovu načte. U jiných způsobů (např. --standalone nebo --webroot) přidejte hook:

sudo certbot renew --deploy-hook "systemctl reload nginx"

Trvalejší je vložit skript do /etc/letsencrypt/renewal-hooks/deploy/.

Wildcard certifikát (*.mojeapp.cz)

Wildcard lze získat jen přes DNS ověření (DNS-01). Ručně:

sudo certbot certonly --manual --preferred-challenges dns -d 'mojeapp.cz' -d '*.mojeapp.cz'

Certbot vás vyzve k vytvoření TXT záznamu _acme-challenge.mojeapp.cz. Ruční metoda se ale neobnoví automaticky. Pro automatickou obnovu použijte DNS plugin pro vašeho poskytovatele DNS (např. certbot-dns-cloudflare) s API tokenem.

Nejčastější chyby

Timeout during connect (likely firewall problem) Port 80 není dostupný. Zkontrolujte UFW, firewall poskytovatele VPS a jestli nginx běží: sudo ss -tlpn | grep :80.

DNS problem: NXDOMAIN looking up A for ... Doména (nebo www subdoména) nemá DNS záznam. Přidejte ho a počkejte na propagaci.

Invalid response from http://.../.well-known/acme-challenge/...: 404 Požadavek obsloužil jiný server blok nebo vás přesměrování posílá jinam. Ověřte, že server_name sedí a že pravidla v nginx neblokují cestu /.well-known/.

Doména za Cloudflare proxy (oranžový mráček) HTTP-01 obvykle funguje i přes proxy, pokud Cloudflare nepřesměrovává HTTP na HTTPS dřív, než se ověřovací požadavek dostane k vám. Spolehlivější je DNS-01 přes plugin.

too many certificates already issued Narazili jste na rate limit Let’s Encrypt. Při testování používejte --dry-run nebo --staging, které limity produkce nečerpají.

Kontrola konfigurace

sudo nginx -t
openssl s_client -connect mojeapp.cz:443 -servername mojeapp.cz </dev/null 2>/dev/null | openssl x509 -noout -dates -issuer

Druhý příkaz vypíše vydavatele a data platnosti – užitečné při kontrole, že se obnova opravdu projevila.

Shrnutí

certbot --nginx + ověřený renew --dry-run = HTTPS, o které se nemusíte starat. Pamatujte na otevřený port 80, správné DNS a fullchain.pem.