WebCheck

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.de auf https://beispiel.de und erst danach auf www,
  • HTTPS auf allen Subdomains, ausdrücklich auch auf www, wenn es dafür einen DNS-Eintrag gibt,
  • auf der Hauptdomain den Header mit max-age von mindestens 31536000, mit includeSubDomains und preload; 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

  1. Kurz anfangen. max-age=300, also fünf Minuten. Geht etwas schief, ist es bald vorbei.
  2. Schrittweise erhöhen. Über eine Woche (604800) und einen Monat (2592000) auf ein Jahr. Lass jede Stufe mindestens so lange laufen wie ihre max-age.
  3. 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 includeSubDomains einmal gesehen hat, bis zum Ablauf nicht mehr erreichbar.
  4. Preload nur, wenn Du es wirklich willst: preload ergä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=0 aus 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.de auf https://www.beispiel.de kommt ohne Header. Wer beispiel.de eintippt, bleibt dann ungeschützt, denn includeSubDomains auf www gilt 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.