
- HTTPS
- SSL
- Let's Encrypt
- Certbot
- Nginx
- Apache
- Security
HTTPS mit Let's Encrypt auf Nginx und Apache einrichten
Eine vollständige Anleitung zur kostenlosen TLS-Zertifikatverwaltung mit Let's Encrypt und Certbot auf Ubuntu – für Nginx und Apache – inklusive HTTP-zu-HTTPS-Weiterleitungen, HSTS und Fehlerbehebung.
Let’s Encrypt stellt kostenlose, automatisch erneuerte TLS-Zertifikate bereit. Certbot ist der offizielle Client, der das Zertifikat installiert und den Webserver mit einem einzigen Befehl konfiguriert. Diese Anleitung deckt sowohl Nginx als auch Apache auf Ubuntu 22.04 / 24.04 ab.
Voraussetzungen
Bevor Sie beginnen:
- Ein Domainname, der auf die öffentliche IP Ihres Servers zeigt (DNS-A-Record muss propagiert sein)
- Nginx oder Apache installiert und in Betrieb
- Ports 80 und 443 in der Firewall geöffnet (
ufw allow 80undufw allow 443) - Ein grundlegender Virtual Host / Server-Block bereits für Ihre Domain konfiguriert
Nginx: Certbot installieren und Zertifikat beziehen
1. Certbot installieren
sudo apt update
sudo apt install certbot python3-certbot-nginx
2. Zertifikat beziehen und installieren
Ersetzen Sie yourdomain.com durch Ihre tatsächliche Domain:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot wird:
- Den Domainbesitz über eine HTTP-Challenge auf Port 80 verifizieren
- Das Zertifikat herunterladen und installieren
- Ihre Nginx-Konfiguration anpassen, um HTTPS auf Port 443 zu aktivieren
- Eine Weiterleitung von HTTP zu HTTPS hinzufügen
Während des Prozesses wird nach einer E-Mail-Adresse (für Ablaufbenachrichtigungen) und ob HTTP-Traffic weitergeleitet werden soll gefragt.
3. Was Certbot zur Nginx-Konfiguration hinzufügt
Nach der Ausführung von Certbot enthält Ihr Server-Block Ergänzungen ähnlich wie:
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# ... Ihre bestehenden location-Blöcke
}
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
4. Konfiguration prüfen
sudo nginx -t
sudo systemctl reload nginx
Rufen Sie https://yourdomain.com im Browser auf. Sie sollten ein gültiges Schloss-Symbol sehen.
Apache: Certbot installieren und Zertifikat beziehen
1. Certbot installieren
sudo apt update
sudo apt install certbot python3-certbot-apache
2. Erforderliche Apache-Module aktivieren
sudo a2enmod ssl
sudo a2enmod rewrite
sudo systemctl restart apache2
3. Zertifikat beziehen und installieren
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com
Certbot wird:
- Den Domainbesitz verifizieren
- Das Zertifikat herunterladen
- Eine neue SSL-Virtual-Host-Konfiguration unter
/etc/apache2/sites-available/yourdomain.com-le-ssl.conferstellen - Eine HTTP-zu-HTTPS-Weiterleitung zum ursprünglichen Virtual Host hinzufügen
4. Was Certbot für Apache erstellt
Der generierte SSL-Virtual-Host sieht so aus:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
# ... Ihre bestehenden Direktiven
</VirtualHost>
</IfModule>
Und es modifiziert den HTTP-Virtual-Host wie folgt:
RewriteEngine on
RewriteCond %{SERVER_NAME} =yourdomain.com [OR]
RewriteCond %{SERVER_NAME} =www.yourdomain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
5. Prüfen
sudo apachectl configtest
sudo systemctl reload apache2
Automatische Zertifikatserneuerung
Let’s Encrypt-Zertifikate laufen nach 90 Tagen ab. Certbot installiert einen systemd-Timer, der Zertifikate automatisch erneuert, wenn sie 30 Tage vor dem Ablauf sind.
Timer-Status prüfen
sudo systemctl status certbot.timer
Sie sollten active (waiting) sehen. Der Timer läuft zweimal täglich.
Erneuerungsprozess testen
Führen Sie einen Trockenlauf durch, um zu bestätigen, dass die Erneuerung erfolgreich wäre, ohne tatsächlich etwas zu ändern:
sudo certbot renew --dry-run
Ein erfolgreicher Trockenlauf gibt aus: Congratulations, all simulated renewals succeeded.
Manuelle Erneuerung
Falls Sie sofort erneuern müssen:
sudo certbot renew
Certbot erneuert nur Zertifikate, die innerhalb von 30 Tagen ablaufen. Erzwungene Erneuerung unabhängig davon:
sudo certbot renew --force-renewal
HSTS hinzufügen (Empfohlen)
HTTP Strict Transport Security (HSTS) weist Browser an, für Ihre Domain immer HTTPS zu verwenden, auch wenn der Nutzer http:// eingibt. Fügen Sie es Ihrem SSL-Server-Block hinzu, nachdem Sie sicher sind, dass HTTPS korrekt funktioniert.
Nginx:
server {
listen 443 ssl;
# ... andere Direktiven
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
Apache (innerhalb des SSL-<VirtualHost *:443>-Blocks):
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Aktivieren Sie zuerst das headers-Modul in Apache:
sudo a2enmod headers
sudo systemctl reload apache2
Warnung: Sobald HSTS aktiv ist, verweigern Browser HTTP-Verbindungen für die Dauer von
max-age. Testen Sie gründlich vor der Aktivierung und setzen Siepreloadnicht, es sei denn, Sie beabsichtigen, sich in die HSTS-Vorladungsliste einzutragen.
Mehrere Domains auf einem Server
Sie können Zertifikate für mehrere Domains ausstellen. Jede Domain benötigt einen eigenen Certbot-Befehl oder Sie können sie kombinieren:
# Jede Domain einzeln (separate Zertifikate)
sudo certbot --nginx -d site-one.com -d www.site-one.com
sudo certbot --nginx -d site-two.com -d www.site-two.com
# Kombiniert in einem Zertifikat (bis zu 100 SANs pro Zertifikat)
sudo certbot --nginx -d site-one.com -d www.site-one.com -d site-two.com -d www.site-two.com
Separate Zertifikate lassen sich unabhängig voneinander einfacher verwalten. Kombinierte Zertifikate reduzieren die Anzahl der zu verfolgenden Dateien.
Wildcard-Zertifikate
Wildcard-Zertifikate decken *.yourdomain.com (alle Subdomains) ab. Sie erfordern DNS-basierte Verifizierung statt HTTP, sodass Sie eine DNS-Challenge manuell oder mit einem DNS-Provider-Plugin abschließen müssen.
sudo certbot certonly \
--manual \
--preferred-challenges dns \
-d yourdomain.com \
-d "*.yourdomain.com"
Certbot weist Sie an, einen _acme-challenge-TXT-Eintrag zu Ihrem DNS hinzuzufügen. Sobald Sie ihn hinzugefügt haben, drücken Sie Enter zum Fortfahren. Die Wildcard-Erneuerung erfordert ebenfalls DNS-Zugriff, sodass die Automatisierung ohne ein unterstütztes DNS-Provider-Plugin schwieriger ist.
Speicherort der Zertifikatsdateien
Nach der Ausstellung befinden sich Zertifikate unter:
/etc/letsencrypt/live/yourdomain.com/
fullchain.pem — Zertifikat + Zwischenkette (in Webservern verwenden)
privkey.pem — privater Schlüssel
cert.pem — nur Zertifikat (selten direkt benötigt)
chain.pem — nur Zwischenkette
Dies sind Symlinks auf die eigentlichen versionierten Dateien unter /etc/letsencrypt/archive/.
Fehlerbehebung
Error: Could not bind to TCP port 80
Ein anderer Prozess hört bereits auf Port 80 (meist Ihr Webserver). Certbots eigenständiger Modus benötigt freien Port 80. Wenn Sie das --nginx- oder --apache-Plugin verwenden, leiht sich Certbot den Port des Webservers automatisch aus — kein Konflikt.
Connection timed out during challenge
Port 80 wird durch eine Firewall blockiert. Öffnen Sie ihn:
sudo ufw allow 80
sudo ufw allow 443
sudo ufw reload
DNS problem: NXDOMAIN
Der A-Record Ihrer Domain hat sich noch nicht propagiert oder zeigt auf die falsche IP. Prüfen Sie mit:
dig +short yourdomain.com
Certificate not trusted im Browser
Möglicherweise testen Sie in der Staging-Umgebung, oder das Zertifikat wurde für eine andere Domain ausgestellt. Prüfen Sie mit:
sudo certbot certificates
Rate-Limits
Let’s Encrypt erzwingt Rate-Limits (5 doppelte Zertifikate pro Woche und Domain). Wenn Sie diese erreichen, verwenden Sie die Staging-Umgebung zum Testen:
sudo certbot --nginx --staging -d yourdomain.com
Staging-Zertifikate werden von Browsern nicht als vertrauenswürdig eingestuft, verbrauchen aber keine Produktions-Rate-Limits.
Wichtige Hinweise
- Zertifikate sind 90 Tage gültig und werden bei 60 verbleibenden Tagen automatisch erneuert.
- Führen Sie immer
--dry-runaus, um zu bestätigen, dass die Erneuerung funktioniert, bevor Sie sich auf den Timer verlassen. - Löschen Sie niemals Dateien in
/etc/letsencrypt/manuell — verwenden Sie stattdessencertbot delete. - Wenn Sie Ihre Server-Konfiguration erheblich ändern, führen Sie Certbot erneut aus, um sicherzustellen, dass es die richtigen Blöcke noch finden und modifizieren kann.
- HSTS ist innerhalb des
max-age-Fensters nicht rückgängig zu machen — aktivieren Sie es erst, wenn Ihre HTTPS-Einrichtung stabil ist.
Häufig gestellte Fragen
Ist Let’s Encrypt für die Produktion geeignet?
Ja. Let’s Encrypt-Zertifikate werden von allen großen Browsern als vertrauenswürdig eingestuft und von Millionen von Produktionswebsites verwendet. Die 90-tägige Gültigkeit und automatische Erneuerung sind by Design — kurze Laufzeiten begrenzen den Schaden durch Schlüsselkompromittierung.
Kann ich Let’s Encrypt mit einer Subdomain verwenden?
Ja. Schließen Sie die Subdomain im -d-Flag ein: sudo certbot --nginx -d sub.yourdomain.com. Sie erhält ein eigenes Zertifikat (oder kann mit der Apex-Domain in einem einzigen Zertifikat kombiniert werden).
Was passiert, wenn die automatische Erneuerung fehlschlägt?
Let’s Encrypt sendet Ablaufbenachrichtigungs-E-Mails an die Adresse, die Sie bei Certbot registriert haben. Certbot protokolliert Erneuerungsversuche auch unter /var/log/letsencrypt/letsencrypt.log. Die meisten Fehler sind auf einen falsch konfigurierten Webserver zurückzuführen, der die HTTP-Challenge blockiert — beheben Sie die Konfiguration und führen Sie certbot renew manuell aus.
Muss ich Ports dauerhaft öffnen?
Ja — Port 443 für HTTPS-Traffic. Port 80 wird für die HTTP-Challenge während der Ausstellung und Erneuerung sowie für die HTTP-zu-HTTPS-Weiterleitung benötigt. Beide sollten offen bleiben.
Kann ich Let’s Encrypt mit einem nicht standardmäßigen Port verwenden?
Die HTTP-Challenge erfordert Port 80. Wenn Ihr Server hinter einer Firewall oder einem Load Balancer steht, der auf einem nicht standardmäßigen Port terminiert, müssen Sie möglicherweise stattdessen die DNS-Challenge verwenden oder Port-Forwarding konfigurieren, sodass Port 80 der öffentlichen IP Certbot erreicht.