Let's Encrypt: Automated SSL with Certbot (Artikel 322)
Automatisierung der SSL-Zertifikatsverwaltung mit Let's Encrypt. Erfahren Sie alles über den ACME-Standard, Certbot-Integration für Webserver und die Lösung von Wildcard-Challenges via DNS.
# Let’s Encrypt: Das Ende der manuellen Zertifikats-Wartung
TL;DR / Management Summary Jährliche Zertifikats-Käufe und manuelles Einspielen sind in der modernen IT ein Anachronismus. Let’s Encrypt hat TLS-Zertifikate demokratisiert und automatisiert. Mittels des ACME-Protokolls und dem Tool Certbot fordern wir kostenlose, vertrauenswürdige Zertifikate an, die sich alle 60-90 Tage selbstständig erneuern. Ein Senior Admin nutzt Let’s Encrypt für alles – vom öffentlichen Webserver bis hin zum internen Dienst via DNS-Challenge.
# 1. Einführung & Architektur
Wie ACME Vertrauen schafft.
Der ACME (Automated Certificate Management Environment) Standard beweist gegenüber der CA, dass Sie der rechtmäßige Besitzer einer Domain sind.
# Die Challenge-Typen (Mermaid)
graph TD
A[Certbot Client] --> B{Challenge Choice}
B -->|HTTP-01| C[Place file in /.well-known/]
B -->|DNS-01| D[Create TXT Record in DNS]
C --> E[Let's Encrypt Server: Verify via HTTP]
D --> E[Let's Encrypt Server: Verify via DNS]
E -->|Success| F[Issue Certificate]
F --> A
A --> G[Update Webserver Config]
# 2. Praxis: Certbot für Webserver
Installation in Sekunden.
# Für Nginx (Debian/Ubuntu/Arch)
sudo apt install certbot python3-certbot-nginx
# Zertifikat anfordern und Nginx automatisch konfigurieren
sudo certbot --nginx -d myapp.company.com
# Für Apache (RHEL/SLES)
sudo dnf install certbot python3-certbot-apache
sudo certbot --apache -d myapp.company.com
# 3. Wildcards & Interne Netze: DNS-01
Zertifikate ohne offenen Port 80.
Wenn Ihr Server nicht direkt aus dem Internet erreichbar ist, nutzen wir die DNS-Challenge.
# Erfordert ein Plugin für Ihren DNS-Provider (z.B. Cloudflare, Route53, Hetzner)
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/cf.ini -d "*.company.com"
# 4. Day-2 Operations: Automatische Erneuerung
Set it and forget it.
Let’s Encrypt Zertifikate sind nur 90 Tage gültig. Certbot installiert automatisch einen Cronjob oder Systemd-Timer.
# Status prüfen
# Testet die Erneuerung aller Zertifikate (Trockenübung)
sudo certbot renew --dry-run
# 5. Troubleshooting & “War Stories”
Wenn die Erneuerung scheitert.
# Story 1: “Die Redirect-Falle”
Symptom: certbot scheitert mit 404 Not Found bei der HTTP-01 Challenge.
Ursache: Der Webserver hat einen globalen HTTPS-Redirect, der auch den Pfad /.well-known/acme-challenge/ umleitet, bevor Certbot die Datei lesen kann.
Lösung: Schließen Sie den Pfad vom Redirect aus oder nutzen Sie das Certbot-Nginx Plugin, das dies temporär für Sie regelt.
# Story 2: “Das Rate-Limit Disaster”
Symptom: certbot meldet too many certificates already issued for exact set of domains.
Ursache: Ein Admin hat in einem fehlerhaften Skript 20x pro Stunde ein Zertifikat angefordert (z.B. in einer Boot-Schleife eines Containers). Let’s Encrypt blockiert die Domain für eine Woche.
Lösung: Nutzen Sie während der Entwicklung immer den Staging-Server von Let’s Encrypt:
certbot --staging .... Die Zertifikate sind ungültig, unterliegen aber keinen harten Rate-Limits.
# 6. Fazit & Empfehlung
- Automation: Verlassen Sie sich nicht auf manuelle Schritte. Jedes Zertifikat muss per Timer erneuert werden.
- Wahl: Nutzen Sie das DNS-Plugin Ihres Providers. Es ist der sauberste Weg und ermöglicht Wildcard-Zertifikate.
- Wartung: Überwachen Sie die Erneuerungen. Ein abgelaufenes Zertifikat ist ein Totalausfall für Ihre User.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Liste aller Zertifikate | certbot certificates |
| Zertifikat löschen | certbot delete --cert-name <domain> |
| Nur Zertifikat (ohne Config) | certbot certonly ... |
| Erneuerung erzwingen | certbot renew --force-renewal |
| Port 80 Check | `ss -tulpn |
| Systemd Timer Status | `systemctl list-timers |
| Hilfe anzeigen | certbot --help |
| Staging Server | --staging |
| E-Mail ändern | certbot update_account --email <new_mail> |
| Post-Renewal Hook | --post-hook "systemctl reload postfix" |