RFC 6797: HTTP Strict-Transport-Security (HSTS)

Die IETF hat Ende 2012 mit HTTP-Strict-Transport-Security (RFC 6797) einen neuen Internetstandard verabschiedet, der Useragents mitteilen soll, dass die Kommunikation mit einer Webseite nur über verschlüsselte und zertifizierte TLS-Verbindungen abgewickelt werden soll. Damit soll verhindert werden, dass der Benutzer beim ersten Verbindungsaufbau zur unverschlüsselten Version von einem Man-In-The-Middle attackiert werden kann, der die Weiterleitung zur verschlüsselten HTTPS-Version verhindert und somit die Verbindung manipulieren kann.

Der Benutzer tippt nämlich meistens nur den Hostnamen ohne Protokoll in die Adressleiste seines Browsers ein und ist somit über die erste unverschlüsselte Verbindung angreifbar. Wenn ein Webmaster den Useragents (also den Webbrowsern) mitteilen möchte, dass diese nur noch verschlüsselte und beglaubigte Verbindungen zur Webseite aufbauen sollen, dann setzt dieser im HTTP Response-Header der verschlüsselten Version den HSTS-Header mit einer Ablaufzeit, der dann vom Useragent des Besuchers zwischengespeichert wird.

strict-transport-security: max-age=15552000

Wenn der Benutzer dann das nächste mal den Hostnamen ohne HTTPS-Protokoll in die Adressleiste seines Browser eingibt (oder einem Link auf einer Webseite folgt, der auf die unverschlüsselte Version zeigt) dann baut der Browser sofort eine verschlüsselte Verbindung zur Webseite auf, ohne erst via Plaintext-HTTP (als MITM manipulierbar) anzufragen und sich die Weiterleitung zur HTTPS-Version abzuholen (die ein Angreifer natürlich verhindern würde).

Wichtige Information zur Verwendung von HSTS

Beim Einsatz von HTTP-Strict-Transport-Security sollte man sich bewusst sein, dass man im schlimmsten Fall verhindert, dass Benutzer die Webseite erreichen können, wenn diese den HSTS-Header bereits in ihrem Browsercache haben und man als Webmaster (aus welchen Gründen auch immer) nicht mehr sicherstellen kann, dass die Webseite über ein (von einer vom Browser akzeptierten Zertifizierungsstelle beglaubigtes) Zertifikat verfügt. In so einem Fall können Benutzer solange nicht mehr auf die Seite zugreifen, bis die im HSTS-Header gesetzte Zeitspanne verstrichen ist.

HSTS-Warnmeldung in Mozilla Firefox

Den Useragents ist es laut Spezifikation verboten, dem Benutzer eine Möglichkeit zu geben, die dann erscheinende Fehlermeldung zu ignorieren. Auch kann HSTS nicht verhindern, dass ein Man-In-The-Middle-Angriff auf die erste unverschlüsselte Verbindung erfolgreich ist, wenn die Webseite in der Vergangenheit kein einziges mal über eine sichere Verbindung aufgerufen wurde, so dass der HSTS-Header gesetzt werden konnte.

Das alles ist aber kein Grund um vor der Verwendung von Strict-Transport-Security zurück zu schrecken. Und um das Problem mit dem MITM-Angriff auf die erste unverschlüsselte Verbindung zu lösen, sollte man darüber nachdenken, sich auf die HSTS-Preload-Liste setzen zu lassen. Wenn schon, dann richtig! 😄

Den HSTS-Header im Apache setzen

Um den HSTS-Header in der Apache-Konfiguration eines VirtualHosts setzen zu können wird das aktivierte Modul mod_headers benötigt. Danach kann man in Apache-Konfigurationen folgendermaßen den HSTS-Header setzen:

Header always set Strict-Transport-Security "max-age=15552000"

Weiterführende Links

  1. Heise.de • Black Hat: Neue Angriffsmethoden auf SSL vorgestellt
  2. Heise.de • Security-Funktion HSTS als Supercookie
Der Autor

Hi. Ich bin Thomas. Hier veröffentliche ich in unregelmäßgen Abständen mehr oder weniger interessante Beiträge über Dies und Jenes, hauptsächlich über Computer und IT. Außerdem mag ich die Linux-Kommandozeile, vor allem wenn ich mit (m)einer mechanischen Tastatur darauf herumhacken kann. 😀