NGINX SSL/TLS

6 Kernkonzepte
Die wichtigsten SSL/TLS-Konfigurationen für NGINX: SSL Basics · Let's Encrypt · Cipher Suites · HSTS · OCSP Stapling · HTTP/2 SSL/TLS ist essenziell für die Sicherheit von Webanwendungen. Dieses Cheatsheet fasst die wichtigsten NGINX-Konfigurationen für HTTPS, moderne Verschlüsselung und Sicherheitsheader zusammen.

SSL Basics – HTTPS in NGINX aktivieren

listen 443 ssl · ssl_certificate
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; }

SSL Basics – die grundlegende Konfiguration für HTTPS in NGINX. Sie benötigen ein SSL-Zertifikat und den dazugehörigen privaten Schlüssel.

Beispiele
# Minimal-Konfiguration
server {
listen 443 ssl;
server_name example.com;
root /var/www/example.com;
index index.html;
ssl_certificate /etc/ssl/example.com.crt;
ssl_certificate_key /etc/ssl/example.com.key;
}
# HTTP → HTTPS Redirect
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
Tipp: Speichern Sie Zertifikate und Schlüssel außerhalb des Document Roots (z.B. /etc/nginx/ssl/) und setzen Sie restriktive Berechtigungen (chmod 600).

Let's Encrypt – Kostenlose SSL-Zertifikate

certbot · certbot renew
# Zertifikat beantragen certbot --nginx -d example.com -d www.example.com # Automatische Erneuerung testen certbot renew --dry-run

Let's Encrypt bietet kostenlose SSL/TLS-Zertifikate mit automatischer Erneuerung. certbot ist das offizielle Client-Tool für die Zertifikatsverwaltung.

Wichtige Certbot-Befehle

Befehl Beschreibung
certbot --nginx -d domain.de Zertifikat beantragen (NGINX-Plugin)
certbot renew Alle Zertifikate erneuern
certbot renew --dry-run Erneuerung testen (ohne Änderungen)
certbot certificates Alle Zertifikate anzeigen
certbot revoke --cert-path /pfad/ Zertifikat widerrufen
Beispiele
# Zertifikat für mehrere Domains
certbot --nginx -d example.com -d www.example.com -d api.example.com
# Zertifikate automatisch erneuern (Cron)
certbot renew --quiet --post-hook "systemctl reload nginx"
# NGINX-Konfiguration nach Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
Tipp: Certbot erstellt automatisch einen Cronjob für die Erneuerung. Sie können die Erneuerung mit certbot renew --dry-run testen.

Cipher Suites – Verschlüsselungsalgorithmen

ssl_ciphers · ssl_protocols
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on;

Cipher Suites definieren die Verschlüsselungsalgorithmen für die SSL/TLS-Verbindung. Moderne Ciphers bieten bessere Sicherheit und Performance.

Empfohlene SSL-Konfiguration

Direktive Empfehlung
ssl_protocols TLSv1.2 TLSv1.3 (SSLv3, TLSv1.0, TLSv1.1 deaktivieren)
ssl_ciphers Moderne ECDHE-Ciphers bevorzugen (siehe Beispiel)
ssl_prefer_server_ciphers on
ssl_session_cache shared:SSL:10m (verbessert Performance)
ssl_session_timeout 10m
ssl_session_tickets off (sicherer, aber beeinträchtigt Performance leicht)
Beispiele
# Moderne SSL-Konfiguration (Mozilla Intermediate)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
# Performance-Optimierung
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
Tipp: Verwenden Sie die Mozilla SSL Configuration Generator (ssl-config.mozilla.org) für aktuelle Empfehlungen.

HSTS – HTTP Strict Transport Security

add_header Strict-Transport-Security
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

HSTS (HTTP Strict Transport Security) zwingt Browser, Ihre Website immer über HTTPS aufzurufen. Das verhindert SSL-Stripping-Angriffe und verbessert die Sicherheit.

HSTS-Parameter

Parameter Beschreibung
max-age=31536000 Gültigkeitsdauer in Sekunden (1 Jahr = 31536000)
includeSubDomains HSTS auch für Subdomains aktivieren
preload Domain in HSTS-Preload-Liste aufnehmen (optional)
Beispiele
# HSTS mit 1 Jahr und Subdomains
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# HSTS mit Preload (für HSTS-Preload-Liste)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# HSTS nur in HTTPS-Server-Block
server {
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
⚠️ Vorsicht: Sobald HSTS aktiviert ist, können Besucher Ihre Website nur noch über HTTPS erreichen. Testen Sie HSTS zuerst mit einer kurzen max-age (z.B. 300 Sekunden).

OCSP Stapling – Zertifikatsstatus prüfen

ssl_stapling · ssl_stapling_verify
ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; resolver 8.8.8.8 1.1.1.1 valid=300s;

OCSP Stapling verbessert die SSL-Performance, indem der Server den Zertifikatsstatus selbst prüft und dem Browser übermittelt – so entfällt eine separate OCSP-Anfrage des Browsers.

Beispiele
# OCSP Stapling aktivieren
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
# Resolver für OCSP-Anfragen
resolver 8.8.8.8 1.1.1.1 valid=300s;
resolver_timeout 5s;
# Vollständige SSL-Konfiguration mit OCSP
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8;
}
Tipp: OCSP Stapling verbessert die Ladezeit Ihrer Seite, da der Browser keine zusätzliche Anfrage an den OCSP-Server stellen muss. Verwenden Sie zuverlässige DNS-Resolver.

HTTP/2 – Moderne Protokollversion

listen 443 ssl http2
listen 443 ssl http2;

HTTP/2 bietet Multiplexing, Server Push und Header-Kompression – was zu deutlich schnelleren Ladezeiten führt. HTTP/2 benötigt zwingend HTTPS (TLS).

Beispiele
# HTTP/2 aktivieren
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
root /var/www/example.com;
}
# HTTP/2 mit HTTP/1.1 Fallback
server {
listen 443 ssl http2;
listen 443 ssl; # Fallback für alte Clients
server_name example.com;
}
# HTTP/2 Server Push (optional)
location / {
http2_push /style.css;
http2_push /script.js;
}
Tipp: HTTP/2 ist heutzutage Standard. Aktivieren Sie es mit http2 in der listen-Direktive. Für maximale Performance kombinieren Sie es mit OCSP Stapling.

NGINX SSL/TLS im Überblick

listen 443 ssl HTTPS aktivieren
SSL-Zertifikat erforderlich
certbot Let's Encrypt
Kostenlose Zertifikate
ssl_ciphers Verschlüsselung
Moderne Ciphers
HSTS HTTPS erzwingen
Strict-Transport-Security
OCSP Zertifikatsstatus
Stapling für Performance
HTTP/2 Modernes Protokoll
Multiplexing, Server Push

Quick Summary

listen 443 ssl
HTTPS aktivieren
certbot
Let's Encrypt
ssl_ciphers
Cipher Suites
HSTS
HTTPS erzwingen
ssl_stapling
OCSP Stapling
http2
HTTP/2
listen 443 ssl http2 · ssl_certificate /pfad/cert.pem · add_header Strict-Transport-Security ...