HTTP Strict Transport Security

HTTP Strict Transport Security (HSTS) is een techniek om bezoekers van een website automatisch van de onbeveiligde HTTP-verbinding door te sturen naar de beveiligde HTTPS-verbinding.

In dit artikel leggen we uit hoe HSTS werkt, en hoe je het instelt.


HTTP en HTTPS

In het artikel over certificaten hebben we geleerd dat een browser informatie uitwisselt met de webserver met het HyperText Transfer Protocol (HTTP). HTTP is een onbeveiligde verbinding, vandaar dat HTTP Secure (HTTPS) is ontwikkeld om de verbinding tussen de browser en de webserver te beveiligen. Met HTTPS wordt de verstuurde informatie van en naar de website onleesbaar gemaakt en is het onmogelijk om de data te manipuleren door tussenliggende partijen. Dankzij het certificaat weet de browser zeker dat het met de echte webserver van het domein communiceert.

Als je een website URL in een browser invoert zonder het https:// deel zal de browser standaard verbinden met de onbeveiligde HTTP-verbinding. Uiteraard wil je als website eigenaar die bezoekers doorsturen naar de HTTPS-verbinding, om zo veilige communicatie te garanderen.

Het HTTP protocol heeft een voorziening ingebouwd om browsers door te sturen naar een ander adres met HTTP status codes. Status codes zijn een onderdeel van HTTP en geven aan wat het antwoord is van de webserver op een aanvraag van de browser. Een bekende statuscode is bijvoorbeeld 404, welke aangeeft dat het aangevraagde adres niet kan worden gevonden. De status codes voor omleidingen zijn geplaatst in de 300 reeks van de protocol definitie, waarbij code 301 ‘definitief verplaatst’ voor ons nu het meest interessant is.


De 301 omleiding

Met status code 301 kan worden aangegeven dat een pagina definitief verplaatst is naar een nieuw adres, dit nieuwe adres wordt meegestuurd met de 301 code naar de browser, de browser zal deze omleiding volgen naar het nieuwe adres en onthouden dat dit adres permanent is verplaatst (er is ook code 302 voor tijdelijke omleidingen). Met de 301 omleiding kun je browsers omleiden van de HTTP naar HTTPS versie van de website.

De 301 omleiding heeft echter 2 problemen:

  • De bezoeker verbindt nog steeds eerst met een onveilige verbinding om de 301 te ontvangen. Omdat een partij tussen de browser en de webserver de informatie kan manipuleren kunnen ze het 301 antwoord weghalen uit het antwoord, en zo de gebruiker op een onbeveiligde (nep) versie van de website houden.
  • De 301 (permanente omleiding) wordt wel onthouden door de browser, maar moet voor elke pagina, afbeelding, scripts, et cetera worden ontvangen, met de 301 kan niet de hele website in 1 keer worden omgeleid. Het kan dus zijn dat de homepage wel wordt omgeleid naar HTTPS, maar dat onbedoeld toch de andere pagina's, scripts of afbeeldingen worden ingeladen via een onbeveiligde verbinding.

Om deze tekortkoming op te lossen is HSTS geïntroduceerd.


De HSTS-header

Het HTTP Strict Transport Security beleid wordt via een header toegevoegd aan elk antwoord van de webserver. Zodra de browser deze header ontvangt, zal het automatisch omschakelen naar HTTPS voor elke aanvraag op het gehele domein. Zelfs als je handmatig http:// intypt in de adresbalk zal de browser de HTTPS-verbinding gebruiken.

Een HSTS-header ziet er als volgt uit:

strict-transport-security: max-age=31536000; includeSubDomains;

Je ziet hier 2 opties:

max-age (verplicht) dit vertelt de browser hoe lang (in seconden) het de HSTS moet aanhouden voordat het weer toegestaan is om via HTTP te verbinden. In dit voorbeeld zien we 31536000 seconden, wat 365 dagen is. Deze waarde kan nuttig zijn als je verwacht dat je de HSTS-instellingen binnen een bepaalde tijd zullen veranderen.

includeSubdomains (optioneel) wanneer je deze optie toevoegt zal de browser HTTPS gebruiken voor niet alleen de huidige website, maar ook alle onderliggende subdomeinen voor het domein. Bijvoorbeeld <mijnwebsite>.nl en mail.<mijnwebsite>.nl. Deze optie bespaart een potentieel onveilige aanvraag over HTTP voor elk subdomein, maar moet met enige voorzichtigheid worden gebruikt, als je nog een subdomein hebt welke geen HTTPS gebruikt zal je de bezoekers uitsluiten van dit subdomein. Alleen indien je zeker bent dat je altijd alle subdomeinen wilt serveren over HTTPS is deze optie aan te raden.


HSTS-preloading

De oplettende lezer zal opmerken dat om de HSTS-header te ontvangen het kan gebeuren dat je browser bij het eerste bezoek van een website een onveilige verbinding gebruikt. Hiermee is een van de voordelen van HSTS over de 301 code verloren. Om deze reden is de preload optie toegevoegd. Google houd een lijst met websites bij die een preload hebben aangevraagd, deze lijst wordt meegeleverd in alle moderne browsers en wordt automatisch bijgewerkt bij elke update. Ze weet een browser direct dat het HTTPS moet gebruiken voor het domein, zonder daarvoor eerst te hoeven te verbinden met de server. Om gebruik te maken van preloading voeg je de preload optie toe aan de HSTS-header en dien je de website in bij het HSTS preload register.

Met preloading ingeschakeld zie de HSTS-header er dan als volgt uit:

strict-transport-security: max-age=31536000; preload

Merk op dat je hier ook nog includeSubdomains bij kunt zetten.


HSTS of 301?

Het wordt aangeraden om allebei te gebruiken. Oude browsers en bepaalde andere software om websites mee te laden ondersteunen geen HSTS, het is daarom belangrijk ook de 301 te houden, zodat deze ook doorgestuurd worden naar een veilige verbinding.


Risico's

Voordat je HSTS inschakelt, moet je eerst zeker zijn dat er een geldig certificaat is geïnstalleerd op de webserver. Hoewel er met de komst van gratis certificaten geen reden meer is om geen HTTPS te gebruiken, moet je controleren of al je subdomeinen gebruik maken van HTTPS voordat je de includeSubdomains optie inschakelt. Ten slotte moet je zeker zijn dat alle websites onder het domein correct gebruik maken van HTTPS en HSTS voordat je de website indient in het preload register.

Met HSTS ingeschakeld kan je niet makkelijk stoppen met het beveiligde HTTPS te gebruiken, omdat alle browsers die eerder de HSTS-header hebben ontvangen op de website nu nog uitsluitend met HTTPS zullen proberen te verbinden, tot de max-age tijd is verstreken. Wij kunnen ons geen goede reden bedenken waarom je zou willen stoppen met HTTPS, maar indien uw certificaat verloopt betekent het dus dat uw website volledig onbereikbaar zal zijn tot het certificaat wordt vernieuwd. Een goede reden dus om de verloopdatum van de certificaten in de gaten te houden!


Voordelen

Veiligheid

Vanzelfsprekend biedt HSTS een betere beveiliging. Met HSTS (zeker in combinatie met preloading) verbinden browsers niet meer via het onbeveiligde HTTP, waardoor bezoekers beter beschermd zijn tegen hackers, scammers, datalekken, censuur, et cetera.

Snellere laadtijd

Met HSTS bespaar je een 301 omleiding, wat betekent dat de website sneller zal laden voor de bezoeker. Dit is ook belangrijk voor Search Engine Optimisation (SEO).

Minder kans op programmeerfouten

Ook als je per ongeluk een afbeelding, script of ander element via http:// in plaats van https:// in de HTML zet, zal met HSTS de browser automatisch de URL aanpassen naar de beveiligde variant. Mits voor dat domein HSTS is ingesteld natuurlijk.


HSTS instellen

Om HSTS in te stellen voeg je de HSTS-header toe aan de configuratie van je webserver. Per soort webserver is deze configuratie anders, hieronder vind je voorbeelden van de meest voorkomende webservers

Apache:

Voor de Apache webserver is het nodig dat je de module mod_headers inschakelt, en de HSTS-header toevoegt aan het virtualhost segment in de configuratie:

Header always set Strict-Transport-Security "max-age=31536000;"

NGINX:

In de NGINX webserver is het iets simpeler, er hoeven geen extra modules te worden geladen. De header wordt als volgt toegevoegd aan de website configuratie:

add_header Strict-Transport-Security "max-age=31536000;" always;

Microsoft IIS:

In Microsoft IIS kun je headers toevoegen in system.webServer.httpProtocol.customHeaders, als volgt:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

Conclusie

Met HSTS schakelen browsers automatisch over naar de beveiligde verbinding en loop je niet het risico dat de browser onbedoeld toch nog delen van de website opvraagt via een onbeveiligde verbinding. Met HSTS-preloading kun je de website indienen in een register zodat browsers altijd je website openen met een beveiligde HTTPS-verbinding.

De Securist website veiligheidsinspectie controleert op het correcte gebruik van HSTS om zeker te zijn van optimale veiligheid.


Verder lezen

Zie ook onze andere relevante artikelen:

Léon Melis

Over de auteur:

Léon Melis is inspecteur bij Securist. Securist inspecteert websites, e-mail en domeinen op veiligheid en privacybescherming. Als onderdeel van de veiligheidsinspectie voor websites wordt de HSTS instelling gecontroleerd op correct gebruik.