Deel 1 van de serie "EU-webbeveiliging: in 10 stappen naar een betere rating"
Het probleem in 30 seconden
Uw website heeft een TLS-certificaat. Mooi. Maar als een gebruiker http://uw-domein.com intypt — wat gebeurt er dan?
Zonder HSTS: de browser maakt een onversleutelde verbinding. De site stuurt door naar HTTPS. Maar in de milliseconden tussen het HTTP-verzoek en de doorverwijzing kan een aanvaller op hetzelfde netwerk (wifi in een koffiebar, luchthaven, hotel) de verbinding kapen. Man-in-the-middle, cookiediefstal, sessiekaping — allemaal triviaal.
Met HSTS: de browser weet al dat dit domein alleen HTTPS accepteert. Hij maakt direct een versleutelde verbinding. Geen HTTP-verzoek, geen doorverwijzing, geen aanvalsvenster.
Eén header. Eén regel. En 72,4% van de Europese websites heeft het niet.
Wat de data laat zien
Uit de SiteGuardian Benchmark over meer dan 700.000 Europese websites:
- 27,6% heeft HSTS ingeschakeld
- 75,7% stuurt door naar HTTPS — maar zonder HSTS is de doorverwijzing aanvalbaar
- 24,3% stuurt niet eens door, ondanks een geldig certificaat
Dat betekent: drie op de vier websites met een TLS-certificaat gebruiken het niet consequent. Het certificaat is er, de bescherming niet.
Wat is HSTS precies?
HTTP Strict Transport Security (RFC 6797) is een HTTP-antwoordheader die de browser vertelt:
"Maak de komende X seconden uitsluitend verbinding via HTTPS met dit domein. Negeer HTTP volledig."
De header ziet er zo uit:
Strict-Transport-Security: max-age=31536000; includeSubDomains
max-age=31536000— 1 jaar (in seconden). De browser onthoudt de instructie zo lang.includeSubDomains— geldt voor alle subdomeinen (api.uw-domein.com, mail.uw-domein.com, enz.)
Na het eerste bezoek maakt de browser bij elk volgend verzoek direct verbinding via HTTPS — zonder de omweg via HTTP.
Hoe u HSTS inschakelt
Apache (.htaccess of vhost.conf)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Vereiste: mod_headers moet ingeschakeld zijn.
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
De always aan het einde zorgt ervoor dat de header ook op foutpagina's (4xx, 5xx) wordt verstuurd.
Caddy
Caddy stelt HSTS automatisch in wanneer HTTPS actief is. U hoeft niets te doen.
Node.js / Express
app.use((req, res, next) => {
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
next();
});
Of met het helmet-pakket:
const helmet = require('helmet');
app.use(helmet.hsts({ maxAge: 31536000, includeSubDomains: true }));
WordPress
De plugin "Really Simple SSL" of "HTTP Headers" schakelt HSTS in met één klik. U kunt het ook toevoegen aan .htaccess (zie Apache hierboven).
Beheerde hosting (Cloudflare, AWS, Platform.sh, enz.)
De meeste hostingproviders stellen HSTS niet standaard in. Kijk in uw dashboard onder "SSL/TLS-instellingen" of "HTTP-headers". Als de optie niet beschikbaar is, maak dan een .htaccess-bestand aan in de webroot.
Drie fouten om te vermijden
1. Een te korte max-age instellen
max-age=86400 (1 dag) beschermt alleen gebruikers die de afgelopen 24 uur hebben bezocht. Begin met 30 dagen (2592000) en verhoog naar 1 jaar (31536000) zodra alles werkt.
2. includeSubDomains vergeten
Zonder includeSubDomains blijven uw subdomeinen bereikbaar via HTTP. Als mail.uw-domein.com of intranet.uw-domein.com geen TLS hebben, voeg includeSubDomains pas toe als alle subdomeinen HTTPS ondersteunen — anders gaan ze stuk.
3. HSTS inschakelen zonder werkende HTTPS-doorverwijzing
HSTS vereist dat uw website daadwerkelijk bereikbaar is via HTTPS. Test voordat u het inschakelt: navigeer naar https://uw-domein.com. Ziet u een foutmelding, corrigeer dan eerst de TLS-certificaatconfiguratie.
HSTS Preload: de volgende stap
Zodra HSTS werkt en u er zeker van bent dat alle subdomeinen HTTPS ondersteunen, vraag opname aan in de HSTS-preloadlijst:
- Stel de header in op:
max-age=31536000; includeSubDomains; preload - Dien uw domein in op: hstspreload.org
De preloadlijst is ingebouwd in Chrome, Firefox, Safari en Edge. Domeinen op de lijst worden altijd via HTTPS geladen — zelfs bij het allereerste bezoek, voordat de browser de HSTS-header ooit heeft gezien.
Hoe NIS2 en de AVG hierbij aansluiten
HSTS wordt in geen enkele wet bij naam genoemd. Maar:
-
NIS2 Art. 21(2)(d) vereist "beveiliging bij de acquisitie, ontwikkeling en het onderhoud van netwerk- en informatiesystemen, met inbegrip van de behandeling en openbaarmaking van kwetsbaarheden". Een ontbrekende HSTS-header is een bekende, triviaal exploiteerbare kwetsbaarheid.
-
AVG Art. 32 vereist "passende technische maatregelen" om persoonsgegevens te beschermen. Transportversleuteling zonder HSTS is als een slot zonder grendel — het ziet er veilig uit, maar kan met één beweging worden geopend.
Controleer uw domein
Schakel HSTS in, wacht 5 minuten en scan uw domein:
De scan laat u direct zien of HSTS correct is ingesteld, of includeSubDomains actief is en of uw domein in aanmerking komt voor de preloadlijst.
Volgende week in Deel 2: DMARC — van none naar reject. Waarom policy=none niemand beschermt en hoe u in drie stappen een effectief DMARC-beleid bereikt.
Dit artikel maakt deel uit van de serie "EU-webbeveiliging: in 10 stappen naar een betere rating". Data uit de SiteGuardian EU Web Security Benchmark over meer dan 700.000 Europese websites.