markdown
Certifikaty-a-Lets-Encrypt.md
markdown
# Certifikáty a Let's Encrypt Certifikáty zdarma, automaticky obnovované. Většinu práce udělá [Caddy](Caddy) nebo [Traefik](Traefik) sám — tahle stránka je pro případy, kdy to nefunguje nebo kdy si to děláš ručně. Jak certifikáty fungují je v [TLS a HTTPS](TLS-a-HTTPS). ## Jak to funguje Let's Encrypt ověřuje, že doména patří tobě, a pak vystaví certifikát na 90 dní. Protokolu se říká ACME. Ověření má dvě podoby a rozdíl mezi nimi je nejdůležitější věc na téhle stránce. ## HTTP-01 versus DNS-01 **HTTP-01** — server ti pošle náhodný řetězec a ty ho musíš vystavit na `http://tvoje-domena.cz/.well-known/acme-challenge/...`. Let's Encrypt si pro to sáhne. **DNS-01** — vytvoříš TXT záznam v DNS. Let's Encrypt se na něj podívá. | | HTTP-01 | DNS-01 ||---|---|---|| Potřebuje otevřený port 80 zvenku | ano | ne || Funguje za CGNATem | ne | ano || Umí wildcard `*.example.cz` | ne | ano || Potřebuje API klíč k DNS | ne | ano || Nastavení | jednodušší | složitější | **Wildcard jde jen přes DNS-01.** To je nejčastější důvod, proč lidé přecházejí — jeden certifikát pro `*.example.cz` místo dvaceti jednotlivých. **DNS-01 funguje i pro vnitřní služby**, které nejsou z internetu dostupné vůbec. Můžeš mít platný certifikát pro `nas.example.cz`, které ukazuje na `192.168.1.10`. Pro homelab je to elegantní řešení, jak mít všude zelený zámeček bez vlastní certifikační autority. ## certbot ručně Když nepoužíváš Caddy ani Traefik: ```bashapt install certbot python3-certbot-nginx # s automatickou úpravou konfigurace nginxucertbot --nginx -d example.cz -d www.example.cz # jen certifikát, konfiguraci si napíšu sámcertbot certonly --webroot -w /var/www/html -d example.cz``` Certifikáty skončí v `/etc/letsencrypt/live/example.cz/`: - `fullchain.pem` — certifikát včetně mezilehlých, **tenhle chceš**- `privkey.pem` — soukromý klíč- `cert.pem` — jen certifikát bez řetězu, nepoužívej To rozlišení `fullchain` versus `cert` je klasická past. Když použiješ `cert.pem`, web bude fungovat v prohlížeči a selhávat v `curl` a na mobilech, protože chybí mezilehlý certifikát. Viz [TLS](TLS-a-HTTPS). ## Wildcard přes DNS-01 ```bashapt install python3-certbot-dns-cloudflare echo "dns_cloudflare_api_token = tvuj_token" > /root/cf.inichmod 600 /root/cf.ini certbot certonly \ --dns-cloudflare \ --dns-cloudflare-credentials /root/cf.ini \ -d example.cz -d '*.example.cz'``` Token vytvoř s oprávněním pouze `Zone:DNS:Edit` pro konkrétní doménu. Nikdy globální API klíč — ten dává plný přístup k účtu. Pluginy existují pro většinu poskytovatelů: Cloudflare, DigitalOcean, deSEC, Hetzner, Wedos. ## Obnova Certbot si nainstaluje časovač sám: ```bashsystemctl list-timers | grep certbotcertbot renew --dry-run # zkouška nanečisto``` Obnovuje se, když zbývá míň než 30 dní. Zkoušej `--dry-run` po každé změně konfigurace, jinak se o problému dozvíš až za dva měsíce, když ti web spadne. Po obnově se musí služba znovu načíst: ```bashcertbot renew --deploy-hook "systemctl reload nginx"``` ## Limity Let's Encrypt má omezení a dá se do nich narazit při ladění: - 50 certifikátů týdně na registrovanou doménu- 5 neúspěšných ověření za hodinu- 5 duplicitních certifikátů týdně To poslední kousne, když ti Caddy nebo Traefik při každém restartu žádá znovu, protože nemá trvalé úložiště. Zablokuje tě to na týden. **Při ladění používej testovací prostředí:** ```bashcertbot certonly --dry-run ...``` ```# Caddyacme_ca https://acme-staging-v02.api.letsencrypt.org/directory``` ```yaml# Traefik- --certificatesresolvers.le.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory``` Testovací certifikáty prohlížeč neuzná, ale ověříš si, že celý proces projde. ## Vnitřní certifikáty Pro služby bez veřejné domény máš tři možnosti. **DNS-01 s veřejnou doménou** ukazující na vnitřní adresu. Nejjednodušší a certifikát je plnohodnotný. Nevýhoda: vnitřní jména se objeví ve veřejných logech certifikační transparentnosti. **Vlastní certifikační autorita.** Caddy to umí jedním řádkem (`tls internal`), nebo si postav `step-ca`. Musíš pak kořenový certifikát rozvézt na všechna zařízení — a narazíš na to, že aplikace na Androidu ho stejně neuznají. Podrobně i se skripty ve [vlastní certifikační autoritě](Vlastni-certifikacni-autorita). **Certifikáty podepsané sebou samým.** Nejrychlejší, nejotravnější. Varování v prohlížeči navždy. Pro homelab je nejlepší ta první možnost — kup si doménu za dvě stovky ročně a máš klid. ## Diagnostika ```bashcertbot certificates # co mám a do kdy platíopenssl x509 -in fullchain.pem -text -nooutopenssl s_client -connect example.cz:443 -servername example.cz < /dev/null``` | Problém | Příčina ||---|---|| „Timeout during connect" | port 80 není zvenku dostupný || „DNS problem: NXDOMAIN" | doména nesměřuje sem, nebo se změna nerozšířila || „too many certificates" | narazil jsi na limit, čekej týden || Wildcard nejde | používáš HTTP-01, musíš DNS-01 || Funguje v prohlížeči, ne v curl | použil jsi `cert.pem` místo `fullchain.pem` |