Noch mehr Sicherheit durch HSTS

HTTP Strict Transport Security, kurz HSTS, ist ein Standard welcher verhindert, dass Websites über das unsichere HTTP-Protokoll aufgerufen werden. Somit wird die Website ein weiteres Stück sicherer, da die Wahrscheinlichkeit einer man-in-the-middle Attacke sinkt. Ein Eintrag im HTTP-Header teilt dem Client mit, die betreffende Domain ab jetzt nur noch verschlüsselt über HTTPS abzurufen. Somit wird ab dem nächsten Besuch direkt HTTPS verwendet, selbst wenn auf einen Link mit dem HTTP-Präfix geklickt wird, oder die URL mit HTTP eingegeben wurde.

Für Apache-Server kann HSTS durch folgenden Eintrag in die .htaccess aktiviert werden:

Header set Strict-Transport-Security "max-age=31536000"

Das max-age wird dabei in Sekunden angegeben, wobei 31536000 Sekunden ungefähr einem Jahr entsprechen. Innerhalb dieser Zeit wird der Browser nun alle unsicheren Links zu der Domain automatisch in sichere Links umwandeln.

Edit–02.2017 Dies birgt natürlich die Gefahr, dass die Site nicht mehr über normales HTTP erreichbar ist. Sollte aus irgend einem Grund einmal beispielsweise das SSL-Zertifikat ungültig werden (Server-Umzug, Zertifikat läuft aus o.ä.), werden User ausgesperrt da HSTS den Zugriff über eine unsichere Verbindung unterbindet. Der letzte Abschnitt dieser Fehlermeldung ist hier entscheidend:

Preload bietet Sicherheit ab dem ersten Besuch

Hierfür muss der Browser die Website jedoch immer noch ein erstes mal besucht haben, um den HSTS-Header zu erhalten. Erst anschliessend greift diese Regel. Um auch diese Sicherheitslücke beim ersten Besuch einer Website zu schliessen, haben Chrome-Entwickler eine sogenannte Preload-Liste entwickelt. Websites, welche auf dieser Liste eingetragen sind werden automatisch von verschiedenen Browsern (allen voran natürlich Chrome selbst) über HTTPS aufgerufen. Um auf die Liste zu gelangen, kann man auf dieser Website seine Domain eintragen. Der Eintrag wird geprüft und erst aufgenommen, wenn folgende Kriterien erfüllt werden:

  • Die Website muss über ein gültiges SSL-Zertifikat verfügen
  • Die Site muss ausschliesslich über HTTPS laufen, also alle HTTP-Requests auf HTTPS weitergeleitet werden
  • Alle Subdomains inklusive www müssen über HTTPS geliefert werden
  • Der HSTS muss aktiviert sein, dabei muss
    1. der Wert für max-age mindestens 18 Wochen (10886400 Sekunden) betragen
    2. das Token includeSubDomains gesetzt sein
    3. das Preload Token gesetzt sein
    4. HSTS auch für allfällige Redirects aktiviert sein

Ein gültiger Eintrag sähe dann beispielsweise so aus:

Header set Strict-Transport-Security "max-age=10886400; includeSubDomains; preload"

Google schreibt, dass durch HSTS auch Suchergebnisse direkt über sichere URLs verlinkt werden. Somit kann die Suchmaschine, anders als im vorherigen Beitrag beschrieben, also doch über einen Wechsel von HTTP zu HTTPS informiert werden.

Edit–02.2017 Da HTTPS auch für alle Subdomains verlangt wird, ist ein Wildcard SSL-Zertifikat notwendig. Dieses gilt dann automatisch für die Domain inklusive aller Subdomains: *.k-webs.ch Diese Zertifikate sind leider etwas kostspieliger und werden beispielsweise vom kostenlosen Anbieter Let’s Encrypt auch in Zukunft nicht angeboten werden. Für alle Nutzer eines solchen Zertifikats kommt HSTS aus diesem Grund nicht in Frage.

Test des Headers über SSL-Report

Um alle Einstellungen bezüglich SSL zu testen, bietet Qualys SSL Labs ein nützliches Tool an. Mit diesem wird neben dem Zertifikat auch der HTTP-Header genau unter die Lupe genommen. Dank des neuen Eintrags in unserer .htaccess konnten wir im Ranking von A auf A+ steigen.

SSL-Report1

Sollten Sie Fragen zu HSTS und der Preload-Liste haben, hinterlassen Sie gerne einen Kommentar. Auch über Kritik und Anregungen freuen wir uns immer!

5 Kommentare zu “Noch mehr Sicherheit durch HSTS

  1. Pingback: Umstellen einer Website auf HTTPS | k-webs tech blog

  2. Sehr informativer Artikel.
    Was man noch erwähnen sollte ist, dass man für die Option includeSubDomains und preload auch ein entsprechendes Wildcard Zertifikat benötigt.

    Dann ist mir aufgefallen das der folgenden Code oben falsch ist.
    falsch: Header set Strict-Transport-Security „max-age=10886400“; includeSubDomains; preload

    richtig: Header set Strict-Transport-Security „max-age=10886400; includeSubDomains; preload“

    • Danke für den Hinweis! Der Schreibfehler ist korrigiert und der Hinweis zu den Wildcard Zertifikaten ist auch mit drin. Das ist tatsächlich eine gute Info die gefehlt hat.
      Beste Grüsse,
      Jakob

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.