Was ist HSTS?
HSTS steht für HTTP Strict Transport Security. Es ist ein HTTP-Response-Header, der dem Browser mitteilt: "Diese Website darf ausschließlich über HTTPS aufgerufen werden, auch wenn der Nutzer http:// eingibt oder auf einen HTTP-Link klickt."
Ohne HSTS kann ein Angreifer einen sogenannten Downgrade-Angriff durchführen: Er leitet die erste Verbindung von HTTPS auf HTTP um und kann dann den gesamten Datenverkehr mitlesen. HSTS verhindert das, indem der Browser sich merkt, dass die Seite nur über HTTPS erreichbar sein darf.
ThreatPulse bewertet einen fehlenden HSTS-Header als kritisch. Zusätzlich wird gewarnt, wenn der max-age-Wert unter 6 Monaten liegt.
HSTS auf Apache einrichten
Füge folgende Zeile in deine .htaccess-Datei oder in die <VirtualHost>-Konfiguration ein:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Stelle sicher, dass das Apache-Modul mod_headers aktiviert ist:
sudo a2enmod headers
sudo systemctl restart apache2
HSTS auf Nginx einrichten
Füge folgende Zeile in den server-Block deiner HTTPS-Konfiguration ein:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Wichtig: Der Header darf nur im HTTPS-Server-Block stehen, nicht im HTTP-Block, der auf HTTPS weiterleitet. Das always-Keyword sorgt dafür, dass der Header auch bei Fehlerseiten (z. B. 404) gesendet wird.
HSTS in WordPress einrichten
Wenn du keinen Zugang zur Server-Konfiguration hast, kannst du HSTS über ein WordPress-Plugin einrichten. Empfehlenswerte Optionen:
- Headers Security Advanced & HSTS WP: setzt HSTS und weitere Security Headers über das WordPress-Dashboard
- HTTP Headers: bietet eine übersichtliche Oberfläche für alle gängigen Security Headers
Die Plugin-Lösung ist einfacher, aber weniger performant als die Server-Konfiguration, weil PHP bei jedem Request geladen werden muss, bevor der Header gesetzt wird.
Die Parameter im Detail
max-age
Gibt in Sekunden an, wie lange der Browser sich merken soll, dass die Seite nur über HTTPS erreichbar ist. Der empfohlene Wert ist 31536000 (1 Jahr). Ein zu kurzer Wert (unter 6 Monaten) schwächt den Schutz. ThreatPulse warnt ab hier.
includeSubDomains
Gilt die HSTS-Policy auch für alle Subdomains (z. B. blog.example.de, shop.example.de). Empfohlen, wenn alle Subdomains über HTTPS laufen. Vorsicht: Wenn eine Subdomain kein SSL hat, ist sie mit diesem Parameter nicht mehr erreichbar.
preload
Optional: Meldet deine Domain für die HSTS-Preload-Liste an, die in alle großen Browser eingebaut ist. Damit ist deine Domain ab dem allerersten Besuch geschützt, nicht erst nach dem ersten Aufruf. Die Anmeldung erfolgt über hstspreload.org.
Starte mit einem kurzen max-age (z. B. 300 = 5 Minuten) und teste, ob alles korrekt funktioniert. Erst wenn du sicher bist, erhöhe auf den vollen Wert von 31536000.
Häufige Fehler bei HSTS
- HSTS im HTTP-Block setzen: der Header wird bei unverschlüsselten Verbindungen ignoriert, er muss im HTTPS-Block stehen
- includeSubDomains ohne SSL auf Subdomains: Subdomains ohne Zertifikat sind dann nicht mehr erreichbar
- max-age zu kurz: ein Wert unter 6 Monaten bietet unzureichenden Schutz
- Mixed Content nicht bereinigt: wenn deine Seite noch HTTP-Ressourcen lädt (Bilder, Scripts), werden diese nach HSTS-Aktivierung blockiert