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.
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:
- ověří, že doménu ovládáte,
- uloží certifikát do
/etc/letsencrypt/live/mojeapp.cz/, - 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.