ťařina
Obsah Soubory
TLS a reverse proxy

Certifikáty a Let's Encrypt

Aktualizováno 3 min čtení 530 slov

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