Teil 1 der Serie „EU Web Security: In 10 Schritten zum besseren Rating"
Das Problem in 30 Sekunden
Ihre Website hat ein TLS-Zertifikat. Gut. Aber wenn ein Nutzer http://ihre-domain.de eingibt — was passiert?
Ohne HSTS: Der Browser verbindet sich unverschlüsselt. Die Seite leitet auf HTTPS um. Aber in den Millisekunden zwischen HTTP-Request und Redirect kann ein Angreifer im gleichen Netzwerk (Café-WLAN, Flughafen, Hotel) die Verbindung kapern. Man-in-the-Middle, Cookie-Diebstahl, Session-Hijacking — alles trivial.
Mit HSTS: Der Browser weiß bereits, dass diese Domain nur HTTPS akzeptiert. Er verbindet sich direkt verschlüsselt. Kein HTTP-Request, kein Redirect, kein Angriffsfenster.
Ein Header. Eine Zeile. Und 72,4% der europäischen Websites haben ihn nicht.
Was die Daten zeigen
Aus dem SiteGuardian Benchmark mit über 700.000 europäischen Websites:
- 27,6% haben HSTS aktiviert
- 75,7% leiten auf HTTPS um — aber ohne HSTS ist der Redirect angreifbar
- 24,3% leiten nicht einmal um, obwohl ein gültiges Zertifikat vorhanden ist
Das heißt: drei von vier Websites mit TLS-Zertifikat nutzen es nicht konsequent. Das Zertifikat ist da, der Schutz nicht.
Was ist HSTS genau?
HTTP Strict Transport Security (RFC 6797) ist ein HTTP-Response-Header, der dem Browser sagt:
„Verbinde dich mit dieser Domain für die nächsten X Sekunden ausschließlich über HTTPS. Ignoriere HTTP komplett."
Der Header sieht so aus:
Strict-Transport-Security: max-age=31536000; includeSubDomains
max-age=31536000— 1 Jahr (in Sekunden). Der Browser merkt sich die Anweisung so lange.includeSubDomains— gilt auch für alle Subdomains (api.ihre-domain.de, mail.ihre-domain.de, etc.)
Nach dem ersten Besuch verbindet sich der Browser bei jedem weiteren Aufruf direkt über HTTPS — ohne den Umweg über HTTP.
So aktivieren Sie HSTS
Apache (.htaccess oder vhost.conf)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Voraussetzung: mod_headers muss aktiviert sein.
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Das always am Ende stellt sicher, dass der Header auch bei Fehlerseiten (4xx, 5xx) gesetzt wird.
Caddy
Caddy setzt HSTS automatisch wenn HTTPS aktiv ist. Nichts zu tun.
Node.js / Express
app.use((req, res, next) => {
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
next();
});
Oder mit dem helmet Package:
const helmet = require('helmet');
app.use(helmet.hsts({ maxAge: 31536000, includeSubDomains: true }));
WordPress
Plugin „Really Simple SSL" oder „HTTP Headers" aktiviert HSTS mit einem Klick. Alternativ in der .htaccess (siehe Apache oben).
Managed Hosting (Strato, IONOS, all-inkl, etc.)
Die meisten Hosting-Provider setzen HSTS nicht standardmäßig. Prüfen Sie in der Weboberfläche unter „SSL/TLS-Einstellungen" oder „HTTP-Header". Falls nicht vorhanden: .htaccess im Webroot anlegen.
Drei Fehler, die Sie vermeiden sollten
1. max-age zu kurz setzen
max-age=86400 (1 Tag) schützt nur Nutzer, die innerhalb der letzten 24 Stunden auf der Seite waren. Starten Sie mit 30 Tagen (2592000), eskalieren Sie auf 1 Jahr (31536000) wenn alles funktioniert.
2. includeSubDomains vergessen
Ohne includeSubDomains sind Ihre Subdomains weiterhin über HTTP erreichbar. Wenn mail.ihre-domain.de oder intranet.ihre-domain.de kein TLS haben, setzen Sie includeSubDomains erst, wenn alle Subdomains HTTPS können — sonst brechen sie.
3. HSTS ohne funktionierenden HTTPS-Redirect
HSTS setzt voraus, dass Ihre Website tatsächlich über HTTPS erreichbar ist. Testen Sie vor der Aktivierung: Rufen Sie https://ihre-domain.de auf. Kommt eine Fehlermeldung, müssen Sie zuerst das TLS-Zertifikat richtig konfigurieren.
HSTS Preload: Der nächste Schritt
Wenn HSTS läuft und Sie sicher sind, dass alle Subdomains HTTPS können, beantragen Sie die Aufnahme in die HSTS-Preload-Liste:
- Setzen Sie den Header auf:
max-age=31536000; includeSubDomains; preload - Reichen Sie Ihre Domain ein unter: hstspreload.org
Die Preload-Liste ist in Chrome, Firefox, Safari und Edge eingebaut. Domains auf der Liste werden immer über HTTPS aufgerufen — auch beim allerersten Besuch, bevor der Browser den HSTS-Header je gesehen hat.
Wie NIS2 und DSGVO das einordnen
HSTS ist in keinem Gesetz namentlich erwähnt. Aber:
-
NIS2 Art. 21(2)(d) verlangt „Sicherheit bei Erwerb, Entwicklung und Wartung von Netz- und Informationssystemen, einschließlich Umgang mit und Offenlegung von Schwachstellen". Ein fehlender HSTS-Header ist eine bekannte, trivial ausnutzbare Schwachstelle.
-
DSGVO Art. 32 verlangt „geeignete technische Maßnahmen" zum Schutz personenbezogener Daten. Transportverschlüsselung ohne HSTS ist wie ein Schloss ohne Riegel — es sieht geschlossen aus, ist aber mit einem Handgriff zu öffnen.
Prüfen Sie Ihre Domain
Aktivieren Sie HSTS, warten Sie 5 Minuten, und scannen Sie Ihre Domain:
Der Scan zeigt Ihnen sofort, ob HSTS korrekt gesetzt ist, ob includeSubDomains aktiv ist, und ob Ihre Domain für die Preload-Liste qualifiziert ist.
Nächste Woche in Teil 2: DMARC — von none zu reject. Warum policy=none niemanden schützt, und wie Sie in drei Schritten zu einer wirksamen DMARC-Policy kommen.
Dieser Artikel ist Teil der Serie „EU Web Security: In 10 Schritten zum besseren Rating". Die Daten stammen aus dem SiteGuardian EU Web Security Benchmark mit über 700.000 bewerteten Websites.