Certifikáty a Let's Encrypt
Certifikáty a Let's Encrypt
Certifikáty zdarma, automaticky obnovované. Většinu práce udělá Caddy nebo 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.
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:
apt install certbot python3-certbot-nginx
# s automatickou úpravou konfigurace nginxu
certbot --nginx -d example.cz -d www.example.cz
# jen certifikát, konfiguraci si napíšu sám
certbot 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.
Wildcard přes DNS-01
apt install python3-certbot-dns-cloudflare
echo "dns_cloudflare_api_token = tvuj_token" > /root/cf.ini
chmod 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:
systemctl list-timers | grep certbot
certbot 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:
certbot 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í:
certbot certonly --dry-run ...
# Caddy
acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
# 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ě.
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
certbot certificates # co mám a do kdy platí
openssl x509 -in fullchain.pem -text -noout
openssl 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 |