Zum Inhalt springen
Planen wir gemeinsam die passende Software für Ihre Prozesse. Demo oder Angebot: +90 546 737 48 29

TR EN DE

HTTPS in Nginx: SSL-Zertifikat einrichten

HTTPS verschlüsselt den Datenverkehr zwischen dem Browser des Besuchers und Ihrem Server und weist dem Browser nach, dass er tatsächlich mit Ihrem Server spricht. Dafür liegen auf dem Server ein Zertifikat und der dazugehörige private Schlüssel. HTTPS in Nginx zu aktivieren besteht aus drei Aufgaben: das Zertifikat beziehen, Nginx den Speicherort mitteilen und unverschlüsselte Anfragen auf HTTPS weiterleiten.

Diese Anleitung beschreibt den allgemeinen Ablauf mit Let's Encrypt, das kostenlose Zertifikate ausstellt, und dem verbreiteten Client Certbot. Wenn Sie Ihr Zertifikat von einem anderen Anbieter haben, können Sie bei Schritt drei einsteigen. Wenn Ihnen SSL und TLS noch nicht vertraut sind, lesen Sie zuerst die Anleitung Was ist SSL?.

Kurz gefasst

  • Certbot bezieht das Zertifikat; Nginx verweist auf fullchain.pem und privkey.pem.
  • Jede Anfrage auf Port 80 wird mit 301 auf HTTPS weitergeleitet.
  • HSTS wird zuerst mit kurzer Dauer getestet und erst danach verlängert.
  • Die Erneuerung muss automatisch laufen, und Nginx muss danach neu geladen werden.

Das brauchen Sie

  • Administratorrechte (sudo) auf dem Server und ein laufendes Nginx
  • Eine Domain, deren DNS-Eintrag auf die IP-Adresse des Servers zeigt
  • Von außen erreichbare Ports 80 und 443
  • Eine Sicherung der bestehenden Nginx-Konfiguration

Achtung

Sichern Sie die Konfiguration vor jeder Änderung und prüfen Sie sie danach mit „nginx -t“. Dateipfade und Paketnamen unterscheiden sich je nach Distribution; passen Sie die Beispiele an Ihren Server an.

Auf dieser Seite

HTTPS in sieben Schritten

  1. Voraussetzungen prüfen

    Bevor Let's Encrypt ein Zertifikat ausstellt, prüft es, ob die Domain wirklich unter Ihrer Kontrolle steht. Beim gängigsten Verfahren verbindet sich der Validierungsserver über Port 80 mit Ihrer Domain und fordert eine temporäre Datei an. Deshalb gilt:

    • Der DNS-Eintrag der Domain (und des www-Namens, falls Sie ihn nutzen) muss auf diesen Server zeigen.
    • Die Ports 80 und 443 müssen in der Firewall geöffnet sein.
    • In Nginx muss für diese Domain ein server-Block mit korrekter server_name-Zeile vorhanden sein.

    Wo die Site-Dateien liegen, hängt von der Distribution ab: /etc/nginx/conf.d ist verbreitet, /etc/nginx/sites-available ist das Layout von Debian/Ubuntu.

    Ablaufdiagramm: Domain und Ports, Zertifikat beziehen, HTTPS-Serverblock, Weiterleitung, Test, HSTS und automatische Erneuerung : Vergrößern
  2. Zertifikat mit Certbot beziehen

    Der Installationsbefehl für Certbot hängt von Distribution und Paketverwaltung ab; die erste Zeile unten ist nur ein Beispiel. Nach der Installation bezieht die Option --nginx das Zertifikat und trägt die nötigen Zeilen selbst in den passenden server-Block ein. Jedes -d steht für einen Domainnamen.

    Bash
    # Die Installation hängt von der Distribution ab. Beispiel (Paketquellen von Debian/Ubuntu):
    sudo apt install certbot python3-certbot-nginx
    
    # Zertifikat beziehen und in die Nginx-Konfiguration eintragen
    sudo certbot --nginx -d beispiel.de -d www.beispiel.de

    Certbot legt die Dateien unter /etc/letsencrypt/live/beispiel.de/ ab. Für Nginx sind zwei davon wichtig:

    • fullchain.pem: das Zertifikat Ihrer Website zusammen mit dem Zwischenzertifikat. ssl_certificate verweist auf diese Datei.
    • privkey.pem: der private Schlüssel. ssl_certificate_key verweist auf diese Datei. Er wird mit niemandem geteilt und nicht unterhalb des Webroots abgelegt.
    Schema: fullchain.pem enthält das Website-Zertifikat und das Zwischenzertifikat und wird mit ssl_certificate angegeben; privkey.pem ist der private Schlüssel und wird mit ssl_certificate_key angegeben : Vergrößern
  3. HTTPS-Serverblock und Weiterleitung schreiben

    Hat Certbot die Konfiguration selbst angepasst, sehen Sie sich in diesem Schritt nur das Ergebnis an. Schreiben Sie sie von Hand, brauchen Sie zwei Blöcke: Einer lauscht auf Port 80 und leitet jede Anfrage dauerhaft (301) auf HTTPS weiter, der andere antwortet auf Port 443 mit dem Zertifikat.

    Nginx
    # 80: jede Anfrage auf HTTPS weiterleiten
    server {
        listen 80;
        listen [::]:80;
        server_name beispiel.de www.beispiel.de;
    
        return 301 https://$host$request_uri;
    }
    
    # 443: mit dem Zertifikat antworten
    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name beispiel.de www.beispiel.de;
    
        ssl_certificate     /etc/letsencrypt/live/beispiel.de/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/beispiel.de/privkey.pem;
    
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 1h;
    
        root /var/www/beispiel.de/public;
        index index.html;
    }

    Die Zeile return 301 https://$host$request_uri; leitet weiter und behält dabei die angeforderte Adresse samt Query-String bei. ssl_protocols TLSv1.2 TLSv1.3; schaltet alte, unsichere Protokollversionen ab. Die Schreibweise der Direktive, die HTTP/2 aktiviert, hängt von der Nginx-Version ab; sehen Sie in der Dokumentation Ihrer Version nach.

  4. Testen und neu laden

    Prüfen Sie zuerst die Syntax; wenn kein Fehler gemeldet wird, laden Sie Nginx neu. Ein Neuladen (Reload) trennt keine offenen Verbindungen. Kontrollieren Sie anschließend Weiterleitung und Zertifikat von außen.

    Bash
    # Syntax prüfen, dann neu laden
    sudo nginx -t
    sudo systemctl reload nginx
    
    # Leitet die HTTP-Adresse auf HTTPS weiter?
    curl -sI http://beispiel.de/ | grep -i -E "^(HTTP|location)"
    
    # HTTPS-Antwort und Header
    curl -sI https://beispiel.de/
    
    # Ausgelieferte Zertifikatskette anzeigen
    openssl s_client -connect beispiel.de:443 -servername beispiel.de < /dev/null

    In der ersten curl-Ausgabe sollten 301 und eine location-Zeile stehen, die mit https:// beginnt. Prüfen Sie im Browser über die Verbindungsinformationen in der Adressleiste den Domainnamen und das Ablaufdatum des Zertifikats. Bei Problemen hilft der Abschnitt „Häufige Fehler“ weiter unten.

    Schema: häufige Fehler bei der HTTPS-Einrichtung; fehlendes Zwischenzertifikat, gemischte Inhalte, Weiterleitungsschleife, abgelaufenes Zertifikat : Vergrößern
  5. Bei Weitergabe an ein Backend: SSL-Terminierung

    In den meisten Installationen arbeitet Nginx als Reverse Proxy: Es nimmt die Anfrage entgegen und gibt sie an die Anwendung dahinter weiter. Dabei wird die verschlüsselte Verbindung an Nginx geöffnet; das nennt man SSL-Terminierung (auch TLS-Terminierung). Das Zertifikat liegt an einer Stelle, und der Backend-Server muss sich nicht um die Verschlüsselung kümmern.

    Nginx
    upstream app_backend {
        server 127.0.0.1:8080;
    }
    
    server {
        listen 443 ssl;
        server_name beispiel.de www.beispiel.de;
    
        ssl_certificate     /etc/letsencrypt/live/beispiel.de/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/beispiel.de/privkey.pem;
    
        location / {
            # Hier wurde entschlüsselt; zum Backend geht unverschlüsseltes HTTP
            proxy_pass http://app_backend;
    
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # Das vom Besucher verwendete Protokoll: https
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    Für die Verbindung zwischen Nginx und dem Backend gibt es zwei Möglichkeiten:

    • Unverschlüsseltes HTTP: die übliche Wahl, wenn das Backend auf demselben Server läuft (127.0.0.1) oder in einem vertrauenswürdigen, abgeschlossenen internen Netz steht.
    • Erneute Verschlüsselung: Läuft der Datenverkehr durch ein Netz, dem Sie nicht vertrauen, verwenden Sie proxy_pass https://…. Standardmäßig prüft Nginx das Zertifikat des Backends nicht; für die Prüfung sind proxy_ssl_verify on; und proxy_ssl_trusted_certificate nötig.

    Da das Backend die Anfrage als HTTP sieht, kann es nicht erkennen, dass der Besucher über HTTPS gekommen ist. Der Header X-Forwarded-Proto transportiert diese Information; die Anwendung wertet ihn aus, um sichere Cookies zu setzen und korrekte Adressen zu erzeugen. Die Anwendung sollte diesem Header nur vertrauen, wenn er von Ihrem eigenen Proxy stammt. Mehr dazu: Reverse Proxy mit Nginx einrichten.

    Schema der SSL-Terminierung: Der Browser verbindet sich per HTTPS mit Nginx, dort wird entschlüsselt, die Anfrage geht per HTTP oder erneut verschlüsselt mit dem Header X-Forwarded-Proto an das Backend : Vergrößern
  6. HSTS zuerst mit kurzer Dauer aktivieren

    Der HSTS-Header (Strict-Transport-Security) teilt dem Browser mit: „Verbinde dich für die angegebene Dauer nur per HTTPS mit dieser Website.“ Das ist ein starker Schutz, lässt sich aber schwer zurücknehmen: Der Browser kehrt erst nach Ablauf der Dauer zu HTTP zurück. Testen Sie deshalb zuerst mit einem max-age von wenigen Minuten.

    Nginx
    # Test: 5 Minuten
    add_header Strict-Transport-Security "max-age=300" always;
    
    # Wenn alles funktioniert, statt der Zeile oben: 1 Jahr
    # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    Definieren Sie den Header nur im Block für Port 443. Das Wort always sorgt dafür, dass der Header auch bei Fehlerantworten gesendet wird. Bevor Sie includeSubDomains ergänzen, stellen Sie sicher, dass alle Ihre Subdomains per HTTPS funktionieren. Zu den übrigen Headern siehe die Anleitung Sicherheitsheader und HTTPS.

  7. Automatische Erneuerung überprüfen

    Zertifikate von Let's Encrypt sind kurzlebig; sie werden nicht von Hand verfolgt, sondern automatisch erneuert. Certbot-Pakete richten in der Regel einen Zeitplaner ein (systemd-Timer oder Cron); er läuft regelmäßig und erneuert nur Zertifikate, deren Ablauf näher rückt. Überzeugen Sie sich mit einer Probe-Erneuerung, dass die Einrichtung wirklich funktioniert.

    Bash
    # Probe-Erneuerung: Das echte Zertifikat bleibt unberührt
    sudo certbot renew --dry-run
    
    # Zertifikate und Ablaufdaten
    sudo certbot certificates
    
    # Ist der Timer eingerichtet? (auf Distributionen mit systemd)
    systemctl list-timers | grep -i certbot
    
    # Nginx nach einer Erneuerung neu laden
    sudo certbot renew --deploy-hook "systemctl reload nginx"

    Nginx liest die Zertifikatsdatei nur beim Start und beim Neuladen. Ohne Neuladen nach der Erneuerung wird Besuchern weiterhin das alte Zertifikat ausgeliefert, obwohl die Datei erneuert wurde. Der mit --deploy-hook angegebene Befehl läuft nur, wenn tatsächlich ein Zertifikat erneuert wurde. Damit er dauerhaft gilt, können Sie denselben Befehl auch als ausführbares Skript im Verzeichnis /etc/letsencrypt/renewal-hooks/deploy/ ablegen; Certbot führt die Skripte in diesem Verzeichnis nach jeder erfolgreichen Erneuerung aus.

    Ablaufdiagramm: Der Zeitplaner startet certbot renew, ein bald ablaufendes Zertifikat wird erneuert, Nginx wird neu geladen, das neue Zertifikat wird ausgeliefert : Vergrößern

Wenn Certbot die Konfiguration nicht anfassen soll: das Webroot-Verfahren

Wenn Sie die Nginx-Konfiguration vollständig selbst verwalten möchten, können Sie Certbot ausschließlich das Zertifikat beziehen lassen. Bei diesem Verfahren wird die Validierungsdatei in ein von Ihnen festgelegtes Verzeichnis geschrieben; im Block für Port 80 wird dieser Pfad von der Weiterleitung ausgenommen.

Nginx
listen 80;
listen [::]:80;
server_name beispiel.de www.beispiel.de;

# Validierungsdateien werden nicht weitergeleitet
location /.well-known/acme-challenge/ {
    root /var/www/letsencrypt;
}

location / {
    return 301 https://$host$request_uri;
}
Bash
# Nur das Zertifikat beziehen; die Nginx-Konfiguration bleibt unverändert
sudo certbot certonly --webroot -w /var/www/letsencrypt -d beispiel.de -d www.beispiel.de

Wildcard-Zertifikate lassen sich so nicht beziehen; sie erfordern eine Validierung über einen DNS-Eintrag, und die Schritte hängen von Ihrem DNS-Anbieter ab.

TLS-Einstellungen: was hineingehört und was nicht

  • Protokoll: ssl_protocols TLSv1.2 TLSv1.3; genügt für aktuelle Browser. Für TLS 1.3 muss die OpenSSL-Bibliothek, mit der Nginx gebaut wurde, diese Version unterstützen.
  • An einer Stelle definieren: Laufen mehrere Websites auf dem Server, verhindert es Abweichungen zwischen den Websites, die Protokolleinstellung einmal im http-Block zu schreiben.
  • Sitzungscache: ssl_session_cache shared:SSL:10m; verringert wiederholte Handshakes bei wiederkehrenden Besuchern.
  • Cipher-Suites: Kopieren Sie keine alten Listen, die im Internet kursieren. Empfehlungen ändern sich mit der Zeit; aktuelle Empfehlungen finden Sie in der Dokumentation Ihrer Serversoftware. Im Zweifel ist die Voreinstellung besser als eine veraltete, eingefügte Liste.

Häufige Fehler und ihre Behebung

SymptomWahrscheinliche UrsacheBehebung
Im Browser in Ordnung; Zertifikatsfehler auf manchen Telefonen, in Apps oder mit curlFehlendes Zwischenzertifikat: ssl_certificate verweist nur auf das Website-ZertifikatAuf fullchain.pem verweisen
Warnung am Schlosssymbol, einige Bilder oder Skripte werden nicht geladenGemischte Inhalte (Mixed Content): Die Seite ruft Ressourcen über http:// abAdressen in den Seiten und in der Datenbank auf https:// umstellen
Fehler „Zu viele Weiterleitungen“Weiterleitungsschleife: Das vorgeschaltete CDN oder der Proxy verbindet sich per HTTP mit dem Server, und der Server leitet erneut auf HTTPS weiterDen vorgeschalteten Dienst so einstellen, dass er sich per HTTPS mit dem Server verbindet, oder bedingt weiterleiten
Warnung „Zertifikat abgelaufen“Die Erneuerung läuft nicht, oder Nginx wurde danach nicht neu geladenProbe-Erneuerung ausführen; Reload-Hook ergänzen
Das Zertifikat wird nicht ausgestelltDNS zeigt auf einen anderen Server, oder Port 80 ist geschlossenDNS-Eintrag und Firewall prüfen
Warnung wegen abweichendem NamenDas Zertifikat deckt den www-Namen oder die Subdomain nicht abDen fehlenden Namen mit -d ergänzen und das Zertifikat neu beziehen

Zur Weiterleitungsschleife: Terminiert ein Dienst vor Nginx die TLS-Verbindung (zum Beispiel ein CDN wie Cloudflare) und verbindet er sich per HTTP mit dem Server, können Sie die Weiterleitung im Block für Port 80 an das Protokoll knüpfen, das dieser Dienst meldet:

Nginx
listen 80;
server_name beispiel.de www.beispiel.de;

# Nur weiterleiten, wenn der Besucher den vorgeschalteten Dienst per HTTP erreicht hat
if ($http_x_forwarded_proto = "http") {
    return 301 https://$host$request_uri;
}

root /var/www/beispiel.de/public;

Vertrauen Sie diesem Header nur, wenn Sie sicher sind, dass die Anfragen wirklich von Ihrem eigenen Proxy kommen. Die dauerhafte Lösung besteht darin, auch die Strecke zwischen dem vorgeschalteten Dienst und Ihrem Server zu verschlüsseln. Dasselbe Problem tritt auf, wenn die Anwendung hinter Nginx selbst auf HTTPS weiterleitet, den Header X-Forwarded-Proto aber nicht berücksichtigt.

Checkliste

  • ssl_certificate verweist auf die vollständige Kette (fullchain.pem), ssl_certificate_key auf den privaten Schlüssel.
  • Der private Schlüssel ist nur für den berechtigten Benutzer lesbar und liegt weder in Backups noch in Repositorys offen.
  • Die http://-Adresse führt in einem Schritt mit 301 zur https://-Adresse; es gibt keine Schleife.
  • Nur TLS 1.2 und 1.3 sind aktiv.
  • Es gibt keine Warnungen wegen gemischter Inhalte.
  • HSTS wurde mit kurzer Dauer getestet und danach verlängert.
  • Die Probe-Erneuerung ist erfolgreich; nach der Erneuerung wird Nginx neu geladen.
  • Das Ablaufdatum des Zertifikats wird zusätzlich überwacht: Backup und Überwachung.

Häufige Fragen

Ist ein Zertifikat von Let's Encrypt weniger sicher als ein kostenpflichtiges?

Nein. Bei der Verschlüsselung gibt es keinen Unterschied, und Browser akzeptieren beide gleichermaßen. Kostenpflichtige Zertifikate unterscheiden sich durch Zusatzleistungen wie die gesonderte Prüfung der Organisationsidentität, Support und Garantie.

Ich habe das Zertifikat erneuert, der Browser zeigt aber noch das alte. Warum?

Nginx liest die Zertifikatsdatei nur beim Start und beim Neuladen. Prüfen Sie mit „nginx -t“, führen Sie „systemctl reload nginx“ aus und ergänzen Sie einen Reload-Hook, der nach der Erneuerung läuft.

Brauche ich für die Adresse mit und ohne www getrennte Zertifikate?

Nein. Ein einzelnes Zertifikat kann mehrere Namen abdecken; übergeben Sie Certbot jeden Namen mit einer eigenen Option -d.

Vor meinem Server steht ein CDN. Brauche ich trotzdem ein Zertifikat auf dem Server?

Ja, das ist empfehlenswert. Bleibt die Verbindung zwischen CDN und Server unverschlüsselt, ist der Datenverkehr auf dieser Strecke ungeschützt, und es können Probleme wie Weiterleitungsschleifen auftreten. Stellen Sie das CDN so ein, dass es sich per HTTPS mit dem Server verbindet und das Zertifikat prüft.

Kann ich HSTS nach dem Aktivieren wieder zurücknehmen?

Sie können den Eintrag in den Browsern löschen, indem Sie den Header mit max-age=0 senden. Das wirkt jedoch nur in Browsern, die die Website erneut besuchen, und nur, solange HTTPS funktioniert. Deshalb sollten Sie vor einer langen Dauer zuerst eine kurze testen.

BYK Yazılım Support-Team
Diese Anleitung wird vom Support-Team von BYK Yazılım erstellt und regelmäßig überprüft. Letzte Aktualisierung: 04.10.2026.

Verwandte Anleitungen

Sprechen wir über die Infrastruktur Ihrer Website

BYK Yazılım entwickelt Unternehmenswebsites. Schreiben Sie uns bei Fragen zu Ihrer Website.

Kontakt aufnehmen Unternehmenswebsite