HSTS in Spring Boot konfigurieren
HTTP Strict Transport Security per SecurityFilterChain aktivieren -- mit max-age, includeSubDomains, Preload und schrittweisem Rollout.
HSTS in Spring Boot konfigurieren
HTTP Strict Transport Security (HSTS) weist Browser an, ausschliesslich verschluesselte HTTPS-Verbindungen zu verwenden. Der Header verhindert SSL-Stripping-Angriffe und ist mit 15 von 166 Punkten ein wichtiger Faktor im Wolf-Agents Web Security Check.
Spring Security setzt HSTS nicht automatisch. Sie müssen den Header explizit per httpStrictTransportSecurity()-DSL in der SecurityFilterChain aktivieren. Wichtig: Spring Security sendet den HSTS-Header nur über HTTPS-Verbindungen -- auf localhost:8080 ohne TLS erscheint er nicht.
HSTS in SecurityFilterChain aktivieren
Die httpStrictTransportSecurity()-DSL bietet drei Parameter: maxAgeInSeconds() für die Gueltigkeitsdauer, includeSubDomains() für Subdomains und preload() für die Browser-Preload-Liste. Starten Sie mit einem kurzen max-age zum Testen.
// SecurityConfig.java -- HSTS konfigurieren
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http)
throws Exception {
http.headers(headers -> headers
.httpStrictTransportSecurity(hsts -> hsts
// 1 Jahr max-age (Minimum fuer Preload)
.maxAgeInSeconds(31536000)
.includeSubDomains(true)
.preload(true)
)
);
return http.build();
} # application.yml -- HSTS ist NICHT per YAML konfigurierbar
# HSTS muss ueber SecurityFilterChain gesetzt werden.
# Spring Boot bietet keine application.yml-Property fuer HSTS.
# TLS aktivieren (Voraussetzung fuer HSTS)
server:
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: changeit
key-store-type: PKCS12 Starten Sie mit maxAgeInSeconds(300) (5 Minuten) zum Testen. Erhoehen Sie dann auf 604800 (1 Woche) und schliesslich auf 31536000 (1 Jahr). So können Sie bei Problemen schnell zurückrudern.
Verifizierung mit curl
Prüfen Sie den HSTS-Header auf der produktiven Domain. Der Header muss in der HTTPS-Antwort vorhanden sein -- bei HTTP-Anfragen wird er vom Browser ignoriert und von Spring Security nicht gesendet.
# HSTS-Header pruefen (HTTPS erforderlich)
curl -sI https://ihre-domain.de | grep -i strict-transport-security
# Erwartete Ausgabe:
strict-transport-security: max-age=31536000; includeSubDomains; preload
# Achtung: Auf localhost ohne TLS erscheint der Header NICHT
# Spring Security sendet HSTS nur ueber HTTPS-Verbindungen Preload beantragen
Nach erfolgreicher Verifizierung können Sie Ihre Domain bei hstspreload.org zur Aufnahme in die Browser-Preload-Liste einreichen. Voraussetzungen: max-age mindestens 31536000, includeSubDomains und preload müssen gesetzt sein.
preload verwenden. Häufige Fehler bei HSTS in Spring Boot
HSTS auf localhost nicht sichtbar
Spring Security sendet HSTS nur über HTTPS. Auf localhost:8080 ohne TLS erscheint der Header nicht. Testen Sie HSTS auf einer Staging-Umgebung mit gueltigem TLS-Zertifikat oder aktivieren Sie TLS lokal per server.ssl in application.yml.
@Order falsch -- HSTS wird nicht angewandt
Bei mehreren SecurityFilterChain-Beans muss die HSTS-Konfiguration in der FilterChain mit der richtigen @Order sein. Ohne explizite Order kann eine andere FilterChain die Konfiguration überschreiben.
Actuator-Endpoints ohne HSTS
Wenn Actuator auf einem separaten Management-Port laeuft (management.server.port), verwendet er eine eigene Security-Konfiguration. HSTS muss dort separat konfiguriert werden.
Reverse Proxy setzt bereits HSTS
Wenn Nginx oder ein Load Balancer vor Spring Boot HSTS setzt, können doppelte Header entstehen. Entscheiden Sie, ob der Proxy oder Spring Boot den Header setzen soll -- nicht beide.
Compliance-Relevanz
HSTS ist eine Grundvoraussetzung für die Transportsicherheit und wird von allen relevanten Compliance-Frameworks verlangt.
Wie steht Ihre Domain bei HSTS?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.