HSTS Header

HSTS bedeutet HTTP Strict Transport Security. Ist dieser HTTP-Header gesetzt, weist der Webserver den Browser an, für eine gewisse Zeit (Direktive max-age) ausschließlich verschlüsselte Verbindungen für die Domain zu nutzen. Die Spezifikation wurde Ende 2012 als RFC 6797 von der IETF veröffentlicht.

Dieser Security Header ist eine der Voraussetzungen für die Bestnote von SSL Labs mit 100% A+ für das SSL-Zertifikat. Dafür ist ein max-age von mindestens 1 Gemeinjahr = 365 Tage = 31.536.000 Sekunden notwendig.

Apache Beispielkonfiguration

In der .htaccess eintragen

Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

mod_headers

muß natürlich geladen sein, damit obige Anweisung funktioniert. Falls nicht, dies nachholen mit

a2enmod headers
service apache2 restart

includeSubdomains

Die Direktive includeSubDomains sorgt dafür, daß auch Subdomains verschlüsselt übertragen werden, beispielsweise https://domain.xx, https://www.domain.xx, https://sub.domain.xx und https://www.sub.domain.xx

preload

Google Chrome führt eine Liste von Domains, die automatisch immer verschlüsselt aufgerufen werden sollen. Die Liste ist im Chrome-Browser hardcoded hinterlegt. Die meisten anderen Browserhersteller (Firefox, Opera, Safari, Internet Explorer 11 und Edge) greifen ebenfalls auf diese Liste zurück. Sind die HTTP-Header richtig konfiguriert (und natürlich auch das SSL-Zertifikat), ist man berechtigt die Domain in der Liste einzutragen.

Ist die Domain in der Preload-Liste eingetragen, werden die Browser, die HSTS unterstützen, automatisch die https-Version der Website laden.

Man muß sich der Konsequenz bewußt sein, was das zu bedeuten hat!

Bei Zertifikatfehlern gibt es dann keine Möglichkeit mehr die Website aufzurufen bis zum Ablauf von max_age. Wenn zum Bespiel das Zertifikat abgelaufen ist kann die Website nicht mehr angezeigt werden, da das Zertifikat falsch ist.

Insecure SSL Cert in Firefox

Es kann wegen HSTS keine Ausnahme für das falsche Zertifikat im Browser angelegt werden. Weiters ist es schwierig, von dieser Liste gestrichen zu werden, da dies mit Google Chrome Updates einher geht. Bis ein neues Update released wird, können Monate vergehen und dann ist es nicht sicher, ob und wann die anderen Browser mitziehen.

Also mit der Direktive preload sparsam umgehen, nicht gleich standardmäßig einsetzen, sondern zuerst darauf hinarbeiten.

Empfohlene Vorgangsweise für Preload HSTS

  1. Zunächst auf allen Subdomains vergewissern, ob HTTPS korrekt funktioniert.
  2. Auf allen Subdomains die Weiterleitung von http zu https einrichten
  3. Dann den HSTS Header auf allen Subdomains setzen mit verschiedenen Phasen der Direktive max-age
    • 5 Minuten:
      max-age=300; includeSubDomains
    • 1 Woche:
      max-age=604800; includeSubDomains
    • 1 Monat:
      max-age=2592000; includeSubDomains

    In jeder Phase testen und beobachten (Traffic, Einnahmen, Benutzerverhalten, etc.) und etwaige SSL-Fehler beheben, die Zeit max-age abwarten, d. h. 1 Monat in der letzten Phase.

  4. Erst wenn wirklich alle Fehler behoben sind und ausgiebig getestet wurde, die Direktive max-age auf 2 Gemeinjahre erhöhen, die Direktive preload hinzufügen und die Website in der Google Chrome HSTS Preload List eintragen
    • 2 Jahre:
      max-age=63072000; includeSubDomains; preload

Google Chrome HSTS Preload List

Erst wenn die Direktive preload gesetzt ist, kann man die Domain in der Preload-Liste eintragen.

allerstorfer.at preload

Preload Status

Der Status der Anfrage kann entweder auf hstspreload.org überprüft werden oder im Chrome-Browser unter chrome://net-internals/#hsts.

Nextcloud Preload Status

WordPress

Das WordPress-Plugin HTTP Headers leistet hier gute Dienste.
HSTS Header WordPress-Plugin

Siehe auch