# Certbot — TLS-Zertifikate von Let's Encrypt automatisieren

> Praxis-Guide zu Certbot — TLS-Zertifikate von Let's Encrypt ausstellen, automatisch erneuern und verwalten, mit Plugins für Apache, NGINX und DNS-Challenges.

Source: https://www.jpkc.com/db/cheatsheets/web-servers/certbot/

<!-- PROSE:intro -->
Certbot ist der offizielle ACME-Client der EFF und der Standardweg, um kostenlose TLS-Zertifikate von Let's Encrypt zu beziehen. Mit einem einzigen Befehl stellst du Zertifikate aus, installierst sie direkt in Apache oder NGINX und richtest die automatische Erneuerung ein. Über Plugins für Webroot, Standalone und DNS-Challenges deckst du jeden Server-Aufbau ab – inklusive Wildcard-Zertifikaten per DNS-01. Dieser Guide zeigt dir die wichtigsten Kommandos vom ersten Zertifikat bis zum unbeaufsichtigten Renewal per systemd-Timer.
<!-- PROSE:intro:end -->

## Zertifikate ausstellen

`certbot certonly --webroot -w <webroot> -d <domain>` — Stellt ein Zertifikat über die Webroot-Methode aus (kein Server-Neustart nötig).

```bash
certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
```

`certbot certonly --standalone -d <domain>` — Stellt ein Zertifikat über einen temporären Standalone-Server aus (Port 80 muss frei sein).

```bash
certbot certonly --standalone -d example.com
```

`certbot certonly --nginx -d <domain>` — Stellt ein Zertifikat über das NGINX-Plugin aus (konfiguriert NGINX automatisch).

```bash
certbot certonly --nginx -d example.com -d www.example.com
```

`certbot certonly --apache -d <domain>` — Stellt ein Zertifikat über das Apache-Plugin aus (konfiguriert Apache automatisch).

```bash
certbot certonly --apache -d example.com
```

`certbot certonly --dns-<provider> -d <domain>` — Stellt ein Zertifikat über die DNS-01-Challenge aus (für Wildcards und interne Server).

```bash
certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/cloudflare.ini -d '*.example.com'
```

`certbot certonly --manual -d <domain>` — Stellt ein Zertifikat mit manuellen Challenge-Schritten aus (interaktiv).

```bash
certbot certonly --manual -d example.com --preferred-challenges dns
```

`certbot --preferred-challenges http` — Legt den bevorzugten Challenge-Typ fest (http-01 oder dns-01).

```bash
certbot certonly --standalone --preferred-challenges http -d example.com
```

## Automatische Installation (Server-Plugins)

`certbot --nginx` — Stellt ein Zertifikat aus und installiert es automatisch für NGINX.

```bash
certbot --nginx -d example.com -d www.example.com
```

`certbot --apache` — Stellt ein Zertifikat aus und installiert es automatisch für Apache.

```bash
certbot --apache -d example.com -d www.example.com
```

`certbot --nginx --redirect` — Installiert das Zertifikat und richtet automatisch eine Weiterleitung von HTTP auf HTTPS ein.

```bash
certbot --nginx --redirect -d example.com
```

`certbot --nginx --no-redirect` — Installiert das Zertifikat, ohne eine Weiterleitung einzurichten.

```bash
certbot --nginx --no-redirect -d example.com
```

`certbot install --cert-name <name>` — Installiert ein bereits ausgestelltes Zertifikat im Webserver.

```bash
certbot install --nginx --cert-name example.com
```

## Zertifikate verwalten

`certbot certificates` — Listet alle von Certbot verwalteten Zertifikate mit ihren Details auf.

```bash
certbot certificates
```

`certbot renew` — Erneuert alle Zertifikate, die zur Erneuerung anstehen.

```bash
certbot renew
```

`certbot renew --dry-run` — Testet den Erneuerungsvorgang, ohne tatsächlich zu erneuern.

```bash
certbot renew --dry-run
```

`certbot renew --force-renewal` — Erzwingt die Erneuerung aller Zertifikate unabhängig vom Ablaufdatum.

```bash
certbot renew --force-renewal
```

`certbot renew --cert-name <name>` — Erneuert ein bestimmtes Zertifikat anhand seines Namens.

```bash
certbot renew --cert-name example.com
```

`certbot delete --cert-name <name>` — Löscht ein Zertifikat samt zugehöriger Dateien.

```bash
certbot delete --cert-name old.example.com
```

`certbot update_symlinks` — Repariert defekte Symlinks im Live-Verzeichnis.

```bash
certbot update_symlinks
```

## Renewal-Hooks

`certbot renew --pre-hook "<command>"` — Führt einen Befehl vor dem Erneuerungsversuch aus (z. B. einen Dienst stoppen).

```bash
certbot renew --pre-hook "systemctl stop nginx"
```

`certbot renew --post-hook "<command>"` — Führt einen Befehl nach dem Erneuerungsversuch aus (egal ob erfolgreich oder nicht).

```bash
certbot renew --post-hook "systemctl start nginx"
```

`certbot renew --deploy-hook "<command>"` — Führt einen Befehl nur nach einer erfolgreichen Erneuerung aus.

```bash
certbot renew --deploy-hook "systemctl reload nginx"
```

`/etc/letsencrypt/renewal-hooks/deploy/` — Lege hier ausführbare Skripte ab, die automatisch nach erfolgreichen Erneuerungen laufen.

```bash
#!/bin/bash
systemctl reload nginx
```

`/etc/letsencrypt/renewal-hooks/pre/` — Skripte, die vor jedem Erneuerungsversuch laufen.

```bash
ls /etc/letsencrypt/renewal-hooks/pre/
```

`/etc/letsencrypt/renewal-hooks/post/` — Skripte, die nach jedem Erneuerungsversuch laufen.

```bash
ls /etc/letsencrypt/renewal-hooks/post/
```

## Zertifikat-Optionen

`certbot --key-type ecdsa` — Fordert ein ECDSA-Zertifikat an (kleiner und schneller als RSA).

```bash
certbot certonly --nginx --key-type ecdsa -d example.com
```

`certbot --rsa-key-size <bits>` — Legt die RSA-Schlüssellänge fest (Standard: 2048).

```bash
certbot certonly --nginx --rsa-key-size 4096 -d example.com
```

`certbot --email <email>` — Setzt die E-Mail-Adresse für dringende Erneuerungs- und Sicherheitshinweise.

```bash
certbot --email admin@example.com -d example.com
```

`certbot --agree-tos` — Akzeptiert die Nutzungsbedingungen von Let's Encrypt nicht-interaktiv.

```bash
certbot --agree-tos --email admin@example.com -d example.com
```

`certbot --non-interactive` — Läuft im nicht-interaktiven Modus (bricht ab, statt nachzufragen).

```bash
certbot certonly --non-interactive --webroot -w /var/www/html -d example.com
```

`certbot --expand -d <domains>` — Fügt einem bestehenden Zertifikat weitere Domains hinzu.

```bash
certbot --expand -d example.com -d blog.example.com -d shop.example.com
```

`certbot --cert-name <name> -d <new-domains>` — Ersetzt die Domain-Liste eines bestehenden Zertifikats.

```bash
certbot --cert-name example.com -d example.com -d www.example.com -d api.example.com
```

## Dateipfade

`/etc/letsencrypt/live/<domain>/fullchain.pem` — Die vollständige Zertifikatskette (Zertifikat + Intermediate). Für ssl_certificate in NGINX verwenden.

```bash
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
```

`/etc/letsencrypt/live/<domain>/privkey.pem` — Der private Schlüssel. Für ssl_certificate_key in NGINX verwenden.

```bash
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
```

`/etc/letsencrypt/live/<domain>/cert.pem` — Nur das Server-Zertifikat (ohne Kette).

```bash
cat /etc/letsencrypt/live/example.com/cert.pem
```

`/etc/letsencrypt/live/<domain>/chain.pem` — Nur das/die Intermediate-Zertifikat(e).

```bash
cat /etc/letsencrypt/live/example.com/chain.pem
```

`/etc/letsencrypt/renewal/<domain>.conf` — Konfigurationsdatei für die Erneuerung eines Zertifikats.

```bash
cat /etc/letsencrypt/renewal/example.com.conf
```

`/var/log/letsencrypt/letsencrypt.log` — Certbot-Logdatei zur Fehlersuche.

```bash
tail -100 /var/log/letsencrypt/letsencrypt.log
```

## Automatisierung & Cron

`0 0,12 * * * certbot renew --quiet` — Empfohlener Cron-Job: zweimal täglich Erneuerung versuchen (erneuert nur, wenn fällig).

```bash
0 0,12 * * * /usr/bin/certbot renew --quiet
```

`systemctl list-timers | grep certbot` — Prüft, ob der systemd-Timer für die automatische Erneuerung aktiv ist.

```bash
systemctl list-timers | grep certbot
```

`systemctl status certbot.timer` — Prüft den Status des certbot-systemd-Timers.

```bash
systemctl status certbot.timer
```

`certbot renew --quiet --deploy-hook "systemctl reload nginx"` — Automatische Erneuerung mit automatischem NGINX-Reload bei Erfolg.

```bash
0 3 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"
```

## Testen & Staging

`certbot --staging` — Nutzt den Staging-Server von Let's Encrypt (höhere Rate-Limits, nicht vertrauenswürdige Zertifikate).

```bash
certbot certonly --staging --nginx -d test.example.com
```

`certbot --dry-run` — Simuliert die Zertifikatsanfrage, ohne etwas zu speichern.

```bash
certbot certonly --dry-run --webroot -w /var/www/html -d example.com
```

`certbot revoke --cert-path <path>` — Widerruft ein Zertifikat (z. B. wenn der private Schlüssel kompromittiert wurde).

```bash
certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem
```

`certbot revoke --cert-path <path> --reason keycompromise` — Widerruft mit einem bestimmten Grund-Code.

```bash
certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem --reason keycompromise
```

<!-- PROSE:outro -->
## Fazit

Certbot nimmt dir die gesamte Zertifikatsverwaltung ab: Einmal eingerichtet, erneuern sich deine Zertifikate unbeaufsichtigt über den systemd-Timer oder einen Cron-Job. Achte beim Einrichten und Testen auf die Rate-Limits von Let's Encrypt und nutze dafür `--dry-run` oder `--staging`, statt produktive Anfragen zu verbrauchen. Setze `--force-renewal` nur, wenn es wirklich nötig ist – jede erzwungene Erneuerung zählt auf dein Rate-Limit. Prüfe die automatische Erneuerung regelmäßig mit `certbot renew --dry-run`.

## Weiterführende Links

- [Certbot – offizielle Dokumentation](https://eff-certbot.readthedocs.io/) – Referenz und Anleitungen (englisch)
- [certbot.eff.org](https://certbot.eff.org/) – interaktive Setup-Anleitung der EFF (englisch)
- [Let's Encrypt](https://letsencrypt.org/de/) – Hintergrund, Rate-Limits und Dokumentation
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [apache](https://www.jpkc.com/db/cheatsheets/web-servers/apache/) – Webserver, den Certbot direkt konfigurieren kann
- [caddy](https://www.jpkc.com/db/cheatsheets/web-servers/caddy/) – Webserver mit automatischem HTTPS ab Werk
- [ferron](https://www.jpkc.com/db/cheatsheets/web-servers/ferron/) – moderner Webserver mit integriertem TLS

