HSTS einrichten: Strict-Transport-Security, max-age und Preload-Liste
Mit HSTS legt Deine Website fest, dass Browser sie nur noch über HTTPS aufrufen. Der Header ist schnell gesetzt. Wer ihn vorschnell auf alle Subdomains ausdehnt, sperrt allerdings womöglich das eigene Testsystem aus.
Stand: 05.11.2026
Was HSTS bewirkt
Tippt jemand beispiel.de ohne Protokoll ein, fragt der Browser zuerst unverschlüsselt per HTTP an. Erst die Weiterleitung des Servers schickt ihn auf HTTPS. In einem fremden WLAN kann ein Angreifer genau diese Anfrage abfangen, die Weiterleitung unterdrücken und dem Besucher eine unverschlüsselte Kopie der Seite unterschieben. Das nennt sich SSL-Stripping.
HSTS (HTTP Strict Transport Security, RFC 6797) schließt diese Lücke. Die Website schickt in ihren HTTPS-Antworten den Header Strict-Transport-Security. Der Browser merkt sich den Host und schreibt danach jede http://-Adresse dorthin selbst auf https:// um, bevor überhaupt eine Anfrage das Gerät verlässt. Bei Zertifikatsfehlern fällt außerdem der Knopf zum Weiterklicken weg. Die Verbindung bricht ab.
Der Header
Strict-Transport-Security: max-age=31536000; includeSubDomains
| Angabe | Bedeutung |
|---|---|
max-age= |
Pflicht: Sekunden, die sich der Browser die HTTPS-Pflicht merkt; jede Antwort mit Header startet die Frist neu |
includeSubDomains |
die Pflicht gilt auch für alle Subdomains des Hosts |
preload |
Zustimmung zur Aufnahme in die Preload-Liste; nicht Teil von RFC 6797 |
Jede Angabe darf nur einmal vorkommen. Ein Header ohne lesbares max-age oder mit einer doppelten Angabe ist ungültig, und Browser ignorieren ihn. max-age=0 hebt HSTS auf.
Als ausreichend lange gilt bei ZwoWebCheck eine Dauer ab sechs Monaten, empfohlen ist ein Jahr (31536000). Steht dort nur ein Monat, ist ein Kunde, der seltener vorbeischaut, beim nächsten Besuch wieder ungeschützt.
Über HTTP kommt der Header nicht an. Browser ignorieren ihn dort, weil ihn sonst jeder Angreifer im Netz fälschen könnte.
Die Lücke beim ersten Besuch
HSTS wirkt erst, nachdem der Browser die Seite einmal sauber über HTTPS geladen hat. Neue Besucher haben diesen Schutz noch nicht, ebenso alle, deren Eintrag abgelaufen ist. Dafür gibt es die Preload-Liste. Chrome pflegt sie unter hstspreload.org, die anderen großen Browser übernehmen sie. Was dort steht, kennt der Browser ab Werk.
Für die Aufnahme verlangt hstspreload.org:
- ein gültiges Zertifikat,
- auf Port 80 eine Weiterleitung von HTTP auf HTTPS zunächst auf demselben Host, also von
http://beispiel.deaufhttps://beispiel.deund erst danach aufwww, - HTTPS auf allen Subdomains, ausdrücklich auch auf
www, wenn es dafür einen DNS-Eintrag gibt, - auf der Hauptdomain den Header mit
max-agevon mindestens31536000, mitincludeSubDomainsundpreload; auch eine weitere Weiterleitung unter HTTPS muss ihn tragen.
Eintragen lässt sich nur die ganze Domain. Der Rückweg ist mühsam: Eine Austragung erreicht die Nutzer erst Monate später mit neuen Browser-Versionen, und für andere Browser als Chrome gibt es keine Zusage. Beantrage Preload erst, wenn jede Subdomain auf Dauer HTTPS kann.
HSTS sicher einführen
- Kurz anfangen.
max-age=300, also fünf Minuten. Geht etwas schief, ist es bald vorbei. - Schrittweise erhöhen. Über eine Woche (
604800) und einen Monat (2592000) auf ein Jahr. Lass jede Stufe mindestens so lange laufen wie ihremax-age. - Subdomains einbeziehen, sobald alle per HTTPS mit gültigem Zertifikat erreichbar sind. Denk an Intranet, Druckeroberfläche und alte Testsysteme. Eine Subdomain ohne HTTPS ist für jeden Browser, der
includeSubDomainseinmal gesehen hat, bis zum Ablauf nicht mehr erreichbar. - Preload nur, wenn Du es wirklich willst:
preloadergänzen und die Domain auf hstspreload.org eintragen.
Für nginx gehört die Zeile in den server-Block für Port 443:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Ohne always fehlt der Header auf Fehlerseiten. Tückischer ist die Vererbung. Sobald ein location-Block ein eigenes add_header enthält, gelten dort die Header der Ebene darüber nicht mehr, und HSTS verschwindet still für diese Pfade.
Für Apache mit mod_headers im VirtualHost für Port 443:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Typische Fehler
- Der Header fehlt auf einem Teil der Antworten, etwa auf Fehlerseiten. Öffnet ein Besucher zuerst so eine Seite, lernt sein Browser nichts.
- Der Header geht auch über HTTP raus. Browser ignorieren ihn dort, und RFC 6797 untersagt es dem Server.
max-age=0aus einem Test stehen gelassen. Der Header ist da, HSTS aber abgeschaltet.- Reverse Proxy und Anwendung setzen den Header beide. Browser werten nur den ersten aus, und wenn die Werte voneinander abweichen, gilt womöglich der schwächere. Pflege HSTS an genau einer Stelle.
- Die Weiterleitung von
https://beispiel.deaufhttps://www.beispiel.dekommt ohne Header. Werbeispiel.deeintippt, bleibt dann ungeschützt, dennincludeSubDomainsaufwwwgilt nicht für die Hauptdomain darüber.
HSTS prüfen
Gib Deine Adresse bei ZwoWebCheck ein. Die Prüfung liest nur, was jeder Browser beim Aufruf auch bekommt, und nimmt sich die erste HTTPS-Antwort vor, auch wenn das eine Weiterleitung ist. Im Bericht stehen Gültigkeit und Dauer des Headers, ob er Subdomains einschließt und, wenn Du die Hauptdomain prüfst, was noch für die Preload-Liste fehlt.