TLS Härtung Nginx Apache Konfiguration
TLS-Härtung – Nginx und Apache sicher konfigurieren (TLS 1.3, moderne Cipher)
Transport Layer Security (TLS) ist fundamental für sichere HTTPS-Verbindungen. Viele Server-Konfigurationen verwenden jedoch veraltete Standards und schwache Cipher-Suites, die Ihre Benutzer gefährden. Dieses Tutorial zeigt, wie Sie Nginx und Apache modern und sicher konfigurieren.
Warum TLS-Härtung wichtig ist
- Veraltete Protokolle entfernen – SSLv3, TLS 1.0, TLS 1.1 sind anfällig und sollten deaktiviert sein
- Schwache Ciphers blockieren – Viele alte Cipher-Suites sind kryptographisch gebrochen
- Perfect Forward Secrecy – Selbst wenn ein Langzeit-Schlüssel kompromittiert wird, sind alte Sessions sicher
- Compliance – PCI-DSS, HIPAA und andere Standards fordern starke TLS-Konfiguration
- Benutzer-Vertrauen – Moderne Browser warnen vor schwachen TLS-Konfigurationen
Aktuelle TLS-Konfiguration überprüfen
Mit testssl.sh
Installieren Sie testssl.sh:
git clone https://github.com/drwetter/testssl.sh.git cd testssl.sh chmod +x testssl.sh
Dann scannen Sie Ihren Server:
./testssl.sh https://your-domain.com 2>&1 | tee ssl-scan.txt
Die Ausgabe zeigt:
- Unterstützte Protokolle (TLS-Versionen)
- Cipher-Suites und deren Stärke
- Sicherheitslücken und Empfehlungen
- Zertifikat-Gültigkeit
Mit Qualys SSL Labs
Online-Tool: https://www.ssllabs.com/ssltest/
Dies bietet einen einfachen, grafischen Überblick über die aktuelle Konfiguration.
Nginx TLS-Härtung
Grundlegende Protokoll-Konfiguration
Bearbeiten Sie /etc/nginx/nginx.conf oder eine virtuelle Host-Datei:
http {
# Nur sichere TLS-Versionen zulassen
ssl_protocols TLSv1.2 TLSv1.3;
# Cipher Suites priorisieren (nach Stärke)
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;
# Server entscheidet die Cipher-Priorität, nicht der Client
ssl_prefer_server_ciphers on;
# Session Konfiguration
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
}
Virtual Host Konfiguration
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name your-domain.com;
# Zertifikat und Schlüssel
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# HSTS Header (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# OCSP Stapling (optional)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Weitere Security Headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
location / {
proxy_pass http://backend;
}
}
Perfect Forward Secrecy (DHParams)
Generieren Sie starke Diffie-Hellman Parameter (einmalig):
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
Dies dauert mehrere Minuten. Dann in nginx.conf einbinden:
ssl_dhparam /etc/nginx/dhparam.pem;
Nginx neu laden und testen
sudo nginx -t sudo systemctl reload nginx
Apache TLS-Härtung
Grundlegende Protokoll-Konfiguration
Bearbeiten Sie /etc/apache2/mods-available/ssl.conf:
# Nur sichere Protokolle SSLProtocol -all +TLSv1.2 +TLSv1.3 # Moderne Cipher-Suite SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 # Server bevorzugt Cipher-Reihenfolge SSLHonorCipherOrder on # Session Caching SSLSessionCache shmcb:/var/cache/apache2/ssl_scache(512000) SSLSessionCacheTimeout 300
VirtualHost Konfiguration
Bearbeiten Sie /etc/apache2/sites-available/your-domain.conf:
ServerName your-domain.com ServerAlias www.your-domain.com SSLEngine on SSLCertificateFile /path/to/fullchain.pem SSLCertificateKeyFile /path/to/privkey.pem SSLCertificateChainFile /path/to/chain.pem # HSTS Header Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # OCSP Stapling SSLUseStapling on SSLStaplingCache shmcb:/var/run/ocsp(128000) # Weitere Security Headers Header always set X-Frame-Options "SAMEORIGIN" Header always set X-Content-Type-Options "nosniff" Header always set X-XSS-Protection "1; mode=block" Header always set Referrer-Policy "strict-origin-when-cross-origin" DocumentRoot /var/www/your-domain
Perfect Forward Secrecy (DHParams) für Apache
sudo openssl dhparam -out /etc/apache2/dhparam.pem 4096
Dann in ssl.conf:
SSLOpenSSLConfCmd DHParameters "/etc/apache2/dhparam.pem"
Apache Module aktivieren
sudo a2enmod ssl sudo a2enmod headers sudo a2enmod rewrite
Dann Apache überprüfen und neu laden:
sudo apache2ctl configtest sudo systemctl reload apache2
HSTS (HTTP Strict Transport Security) Header
HSTS zwingt Browser, immer HTTPS zu verwenden:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Erklärung:
max-age=31536000– 1 Jahr (in Sekunden). Browser nutzen HSTS für diese DauerincludeSubDomains– Auch alle Subdomains müssen HTTPS verwendenpreload– Registrieren Sie Ihre Domain in der HSTS Preload List für weitere Sicherheit
HSTS Preload registrieren: https://hstspreload.org/
OCSP Stapling konfigurieren
OCSP (Online Certificate Status Protocol) Stapling verheim Zertifikat-Sperrungsüberprüfungen:
Für Nginx:
ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/ca-bundle.pem; resolver 8.8.8.8 8.8.4.4;
Für Apache:
SSLUseStapling on SSLStaplingCache shmcb:/var/run/ocsp(128000)
OCSP Response testen
openssl ocsp -no_nonce -issuer /path/to/chain.pem -cert /path/to/cert.pem -url http://ocsp.example.com -header "HOST" "ocsp.example.com"
TLS Session Tickets
Session Tickets ermöglichen schnellere Verbindungen, können aber Sicherheitsrisiken einführen:
Für maximale Sicherheit deaktivieren Sie Session Tickets:
# Nginx ssl_session_tickets off; # Apache SSLSessionTickets off
Cipher-Suite Erklärung
Eine moderne Cipher-Suite wie ECDHE-RSA-AES256-GCM-SHA384 besteht aus:
| Komponente | Beispiel | Funktion |
|---|---|---|
| Schlüsselaustausch | ECDHE | Elliptic Curve Diffie-Hellman Ephemeral (Perfect Forward Secrecy) |
| Authentifizierung | RSA | Server wird mit RSA-Zertifikat authentifiziert |
| Verschlüsselung | AES256 | 256-bit Advanced Encryption Standard |
| Mode | GCM | Galois/Counter Mode (AEAD - authentifizierte Verschlüsselung) |
| Integrität | SHA384 | SHA-384 für Integrität und Pseudorandom Function |
Schwache Cipher blockieren
Explicit blockieren Sie:
# NULL ciphers (keine Verschlüsselung) # !NULL # Export Ciphers (schwache Schlüssellängen) # !EXP # Anonymous DH/ECDH (keine Server-Authentifizierung) # !aNULL # MD5 Hashing (kryptographisch gebrochen) # !MD5 # DES Verschlüsselung (zu kurz) # !DES # RC4 (anfällig) # !RC4
Vergleich: Vor und Nach TLS-Härtung
| Aspekt | Vor Härtung | Nach Härtung | SSL Labs Grade |
|---|---|---|---|
| TLS Versionen | SSLv3, TLS 1.0, 1.1, 1.2 | TLS 1.2, 1.3 nur | Verbessert |
| Cipher-Suite | Schwache und veraltete Ciphers | Nur moderne, starke AEAD Ciphers | Verbessert |
| Perfect Forward Secrecy | Nicht aktiviert | Nur ECDHE/DHE | Verbessert |
| HSTS | Nicht konfiguriert | Aktiviert mit Preload | Verbessert |
| OCSP Stapling | Deaktiviert | Aktiviert | Verbessert |
| Typische Note | B oder C | A+ oder A | A+ / A |
Checkliste für sichere TLS-Konfiguration
- [ ] Nur TLS 1.2 und 1.3 aktiviert
- [ ] Schwache Protokolle (SSLv3, TLS 1.0, 1.1) deaktiviert
- [ ] Moderne AEAD Cipher-Suites definiert
- [ ] Perfect Forward Secrecy (DHParams oder ECDHE) aktiviert
- [ ] HSTS Header konfiguriert und Preload registriert
- [ ] OCSP Stapling aktiviert
- [ ] Session Tickets deaktiviert (oder mit DH Parameters)
- [ ] Mit testssl.sh oder SSL Labs validiert
- [ ] Zertifikat ist gültig und nicht selbstsigniert (für Produktion)
- [ ] Automatische Zertifikat-Erneuerung konfiguriert (Let's Encrypt)
Automatische Zertifikat-Verwaltung mit Certbot
sudo apt install certbot python3-certbot-nginx # Nginx sudo certbot --nginx -d your-domain.com # Apache sudo certbot --apache -d your-domain.com # Automatische Erneuerung sudo certbot renew --dry-run
Zusammenfassung
Eine richtig gehärtete TLS-Konfiguration ist essentiell für sichere HTTPS-Verbindungen. Mit den modernen Cipher-Suites, aktuellen TLS-Versionen und Security Headers (HSTS, OCSP) schützen Sie Ihre Benutzer vor Angriffen und erfüllen moderne Sicherheitsstandards.