# 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:

```bash
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](TLS-a-HTTPS).

## Wildcard přes DNS-01

```bash
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:

```bash
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:

```bash
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í:**

```bash
certbot certonly --dry-run ...
```

```
# Caddy
acme_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

```bash
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` |
