HSTS - HTTP Strict Transport Security

Diesen Beitrag schrieb ich 6 Jahre und 9 Monate zuvor; die nachfolgenden Ausführungen müssen heute nicht unbedingt noch genau so funktionieren. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 1 Minute

RFC 6797 beschreibt den Internetstandard HTTP Strict Transport Security (HSTS): hier schickt dein Webserver einem Aufruf den Header Strict-Transport-Security zusammen mit (unter anderem) einer Zeitangabe. Vor Ablauf dieser Zeit erkennt der Empfänger – also beispielsweise der Browser deines Lesers – deine Webseite bei einem erneuten Besuch wieder und erzwingt die Verschlüsselung für alle im Zertifikat enthaltenen Subdomains.

HSTS und nginx

Die benötigte Einstellung kann wiederum in /etc/nginx/mods-enabled/ssl.conf vorgenommen werden; ich setze hier eine Zeitspanne von zwei Jahren (in Sekunden) fest:

## file: "/etc/nginx/mods-enabled/ssl.conf"
...
## SSL HSTS
add_header Strict-Transport-Security 'max-age=63072000; includeSubDomains; preload';
...

HSTS und apache2

Auch für apache2 kannst du die Einstellungen direkt in der SSL-Konfiguration vornehmen; so wird der Header automatisch gesetzt, wann immer SSL für eine Website aktiviert wird.

## file: "/etc/apache2/mods-enabled/ssl.conf"
...
## SSL HSTS
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
...

HSTS testen

Aus Chrome heraus kannst du testen, ob die neue Einstellung nach einem Restart des Webservers das gewünschte Verhalten nach sich zieht; alternativ nutzt du einen einfachen curl-Aufruf oder aber wiederum den Service der SSL Labs. Auch kannst du deine Webseite eintragen lassen, so dass fest hinterlegt wird, dass Inhalte deiner Webseite ausschließlich über HTTPS übertragen werden – dann solltest du dir aber sicher sein, dass du dein Setup für lange Zeit genau so beibehalten wirst, denn die Eintragung in die Liste kann sich über Monate hinziehen, und für eine Austragung gibt es meines Wissens nach keinen gesicherten Workflow.

$ curl -I https://www.unixe.de
HTTP/1.1 200 OK
Server: nginx/1.8.0
...
Strict-Transport-Security: max-age=63072000
...