← schwarz.cc
--:--:--
02 / BLOG POST

Let's Encrypt

TL;DR Ein Gratis SSL-Zertifikat, das 90 Tage lang gültig ist, sich auf wunsch selbst erneuert und nur wenige Befehle benötigt. Das Zertifikat und der Key landen unter /etc/letsencrypt/live/deinedomain/ und du kannst es in nginx, Postfix, HAProxy oder was auch immer reinschmeissen. Es gibt 2 Wege zur Verifikation: Port 80 oder DNS-Record.

was let's encrypt überhaupt macht – und warum der Spass gratis ist

Let's Encrypt ist eine non-profit Certificate Authority. Die stellen kostenlose TLS-Zertifikate aus weil sie der Meinung sind, dass das ganze Internet verschlüsselt sein sollte. Also sehr Sympathische Typen. Das Protokoll dahinter heisst ACME – Automated Certificate Management Environment – und funktioniert nach dem Prinzip: „Beweise, dass dir die Domain gehört, kriegst du dein Zertifikat."

Let's Encrypt schickt dir eine Challenge. Du legst einen bestimmten Wert irgendwo ab, wo Let's Encrypt nachschauen kann. Die prüfen das. Stimmt es: Zertifikat. Stimmt es nicht – Fehler und du sitzt da und weisst nicht warum. Certbot ist das Tool, das den ganzen Scheiss für dich automatisiert. Du könntest das alles manuell machen. Du kannst den Spass automatisch laufen lassen oder dich selbst darum kümmern - ist mir egal.

FUN FACT Vor Let's Encrypt hat ein SSL-Zertifikat zwischen $50 und $300 pro Jahr gekostet. Von Firmen, die buchstäblich nichts anderes gemacht haben, als eine Datei auszustellen und dafür Geld zu verlangen. Let's Encrypt hat dieses Business 2014 an die Wand gefahren. Und das ist gut so.

certbot installieren

Ist relativ einfach: Terminal öffnen und dann:

sudo apt install certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

# Prüfen, ob es geklappt hat
certbot --version
# → certbot 5.x.x

die zwei verifikationsmethoden:welche nimmst du?

Hier entscheidet sich ob du die nächsten 5 Minuten oder die nächsten 30 Minuten verbringst:

HTTP-01 Verifikation via Port 80 – der einfache Weg (was auch immer du machst)
Certbot legt eine temporäre Datei unter /.well-known/acme-challenge/ auf deinem Server ab. Let's Encrypt ruft diese URL über Port 80 ab. Funktioniert – Zertifiikat wird ausgestellt. Einzige Voraussetzung: Port 80 muss von aussen erreichbar sein und DNS muss auf deinen Server zeigen. Das war's. Aber wir beide wissen: Du hast diesen Port nicht geöffnet und lässt nicht jeden rein. Hierfür gibt es eine andere Lösung.
# Erst prüfen ob DNS stimmt – beide müssen deine IP zeigen
dig deinedomain.ch +short
dig www.deinedomain.ch +short

# Zertifikat holen
sudo certbot certonly --webroot \
  -w /var/www/html \
  -d deinedomain.ch \
  -d www.deinedomain.ch

Mit --webroot schreibt certbot die Challenge-Datei direkt in dein Document Root. Kein Webserver-Neustart, kein Unterbruch, kein Voodoo.

DNS-01 Verifikation via DNS-Record – wenn Port 80 zu ist
Du bist schlau: Port 80 zu oder du willst ein Wildcard-Zertifikat für *.deinedomain.ch? Dann DNS-01. Certbot spuckt dir einen TXT-Record aus den du bei deinem DNS-Provider einträgst. Let's Encrypt prüft, ob der Record da ist. Dauert etwas länger wegen DNS-Propagation, funktioniert aber immer.
sudo certbot certonly --manual \
  --preferred-challenges dns \
  -d deinedomain.ch \
  -d www.deinedomain.ch

# Certbot gibt dir sowas aus:
# Please deploy a DNS TXT record under:
# _acme-challenge.deinedomain.ch
# with value: xK92jd8aLm... (zufälliger String)
#
# → Bei deinem Registrar als TXT-Record eintragen
# → Warten bis propagiert:
dig _acme-challenge.deinedomain.ch TXT +short
# → Wenn der Wert erscheint: Enter drücken → Zertifikat raus
⚠ ACHTUNG: Mit --manual kein automatisches Renewal – beim nächsten Mal musst du den DNS-Record manuell neu setzen. Für Wildcard-Zertifikate (*.deinedomain.ch) ist DNS-01 trotzdem der einzige Weg.

wo das Zertifikat landet – und was du damit machst

Nach erfolgreicher Verifikation sind die Dateien da. Immer. Egal welche Methode. Immer unter dem gleichen Pfad:

/etc/letsencrypt/live/deinedomain.ch/ ├── fullchain.pem # Dein Zertifikat + Intermediate CA - in einer Datei. Kein Manuelles chainen der Bestandteile mehr (wie bei Kostenpflichtiigen Providern). ├── privkey.pem # Private Key – natürlich ├── cert.pem # Nur dein Zertifikat ohne Chain (das brauchst du nie). └── chain.pem # Nur die Intermediate CA (brauchst du auch nie).

In 99% der Fälle brauchst du nur fullchain.pem und privkey.pem

# nginx
ssl_certificate     /etc/letsencrypt/live/deinedomain.ch/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/deinedomain.ch/privkey.pem;

# Postfix (Mailserver)
smtpd_tls_cert_file = /etc/letsencrypt/live/deinedomain.ch/fullchain.pem
smtpd_tls_key_file  = /etc/letsencrypt/live/deinedomain.ch/privkey.pem

# HAProxy – braucht ein kombiniertes File
cat fullchain.pem privkey.pem > /etc/haproxy/certs/deinedomain.pem
⚠ BERECHTIGUNGEN: /etc/letsencrypt/live/ ist nur für root lesbar. Wenn ein Dienst als anderer User läuft (z.B. www-data) muss der entweder Zugriff kriegen oder du kopierst die Zertis woanders hin. Sonst startet der Dienst nicht und du weisst nicht warum.

auto-renewal – einmal einrichten, nie wieder nachdenken

Certbot installiert automatisch einen systemd-Timer der zweimal täglich schaut ob ein Zertifikat in weniger als 30 Tagen abläuft – und es dann erneuert. Du musst nichts tun. Ausser sicherzustellen, dass nach dem Renewal auch der Webserver neu geladen wird:

# Timer läuft – prüfen
sudo systemctl status snap.certbot.renew.timer

# Renewal testen ohne wirklich zu erneuern
sudo certbot renew --dry-run
# Kein Fehler = alles gut. Fehler = Problem.

# Webserver nach Renewal automatisch neu laden
sudo certbot renew --deploy-hook "systemctl reload nginx"

häufige fehler – und was dahintersteckt

ERR
Timeout during connect (likely firewall problem) HTTP-01 gewählt aber Port 80 in der AWS Security Group zu. Entweder Port 80 aufmachen oder DNS-01 nehmen. Beides dauert 2 Minuten.
ERR
DNS problem: NXDOMAIN / wrong IP DNS noch nicht propagiert oder A-Record falsch. dig deinedomain.ch +short muss deine Server-IP ausgeben bevor certbot auch nur angefasst wird. Nicht vorher. Nicht gleichzeitig. Vorher. Manchmmal crashed der Bumms ohne Grund: versuch es einfach nochmal.
ERR
Invalid response / 404 on challenge Webroot stimmt nicht. Der Pfad hinter -w muss exakt das Document Root sein das dein Webserver ausliefert. Nicht der Parent. Nicht irgendwas Ähnliches. Exakt das.
ERR
Non-ASCII domain names not supported Umlaute in der Domain. punycoder.commüller.ch wird zu xn--mller-kva.ch. Den Punycode in certbot eintippen.
ERR
Too many certificates already issued for this domain Let's Encrypt erlaubt 5 Zertifikate pro Domain pro Woche. Wer certbot zu oft mit falschen Parametern drückt läuft da rein. Immer zuerst --dry-run – der zählt nicht gegen das Limit.
✓ Das Zertifikat liegt unter /etc/letsencrypt/live/. Webserver drauf zeigen. Fertig. Kein Geld, kein Aufwand, kein „wir haben leider noch kein HTTPS".