Alle Beiträge
HTTPS padlock with Let's Encrypt, Nginx, and Apache logos
  • 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.

3 Min. Lesen

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 80 und ufw 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:

  1. Den Domainbesitz über eine HTTP-Challenge auf Port 80 verifizieren
  2. Das Zertifikat herunterladen und installieren
  3. Ihre Nginx-Konfiguration anpassen, um HTTPS auf Port 443 zu aktivieren
  4. 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:

  1. Den Domainbesitz verifizieren
  2. Das Zertifikat herunterladen
  3. Eine neue SSL-Virtual-Host-Konfiguration unter /etc/apache2/sites-available/yourdomain.com-le-ssl.conf erstellen
  4. 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 Sie preload nicht, 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-run aus, 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 stattdessen certbot 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.