Wat is HPKP?

HPKP is een verouderde responsheader voor webbeveiliging, het acroniem staat voor HTTP Public Key Pins. Het was bedoeld om te voorkomen dat een gecompromitteerde of frauduleuze certificeringsinstantie een openbaar vertrouwd, maar door een hacker gecontroleerd HTTPS-certificaat voor een website afgeeft. In dit scenario zouden de hackers elk onderschept HTTPS-verkeer naar de getroffen website kunnen ontsleutelen.

Tip: Webresponsheaders zijn stukjes metadata die de server opneemt bij het reageren op verzoeken. Een kleine subset hiervan wordt beveiligingsheaders genoemd, omdat ze verschillende beveiligingsfuncties inschakelen en configureren.

HTTPS-certificaatinfrastructuur

De certificaatinfrastructuur waarop HTTPS is gebouwd, is gebaseerd op een web van vertrouwen. Een aantal bedrijven treedt op als Certificate Authorities (CA) die een of meer rootcertificaten publiceren. Een set basiscertificaten is opgenomen in alle apparaten in een trust store. Wanneer een website een eigen HTTPS-certificaat aanvraagt ​​bij een CA, wordt het certificaat ondertekend door een rootcertificaat. Wanneer uw computer een HTTPS-certificaat ziet, wordt de handtekening gecontroleerd. Als het certificaat is ondertekend door een basiscertificaat dat het vertrouwt, vertrouwt uw computer ook het HTTPS-certificaat.

Tip: Een CA kan ook tussenliggende certificaten laten ondertekenen door het rootcertificaat. Deze tussencertificaten kunnen ook worden gebruikt om HTTPS-certificaten voor websites te ondertekenen.

Het is de taak van een certificeringsinstantie om alleen een certificaat af te geven wanneer ze hebben geverifieerd dat de persoon die ze aanvraagt ​​de echte eigenaar van de website is. Het idee van deze structuur is dat als een hacker zijn eigen certificaat voor een website maakt, dit niet wordt ondertekend door een CA die uw computer vertrouwt, en u dus een waarschuwing te zien krijgt.

Wat deed HPKP?

Het hele certificaatsysteem is afhankelijk van de betrouwbaarheid van de certificaatautoriteiten. Oorspronkelijk was er echter geen bescherming tegen een CA die door hackers zou worden gecompromitteerd of bedrieglijk zou worden en ervoor zou kiezen om ten onrechte certificaten uit te geven.

HPKP is ontworpen als bescherming tegen deze mogelijkheid. Hiermee kunnen websites een exclusieve lijst met certificaten specificeren die kunnen worden vertrouwd voor de website in een proces dat pinnen wordt genoemd. Het was mogelijk om het root- of tussencertificaat vast te pinnen, waardoor één enkele CA certificaten voor de website kon uitgeven. Het was ook mogelijk om het certificaat van de website zelf te pinnen, waardoor zelfs de juiste CA geen ander geldig certificaat kon uitgeven.

Technisch gezien is het niet het certificaat zelf dat wordt vastgezet, maar een hash van de sleutel van het certificaat. Een hash is een cryptografische eenrichtingsfunctie. Dit betekent dat het mogelijk is om te verifiëren dat het certificaat dat door de website aan de browser wordt gepresenteerd, overeenkomt met een vastgezet certificaat, maar het is niet mogelijk om de hash te gebruiken om een ​​geldig certificaat te maken.

HPKP vereist dat er minimaal twee sleutels worden vastgezet, waarvan er minimaal één een back-up moet zijn en niet in de huidige certificaatketen. Met deze back-up kunt u een soepele overdracht naar een nieuw certificaat configureren die niet verhindert dat gebruikers verbinding kunnen maken.

Als het HTTPS-certificaat dat door de website aan de browser wordt gepresenteerd niet overeenkomt met een van de vastgezette certificaten, dan is de browser vereist om het te weigeren en te voorkomen dat de gebruiker het certificaat omzeilt foutmelding.

Structuur van HPKP

De HPKP-header heeft drie verplichte delen en twee optionele. De header moet de titel "Public-Key-Pins" hebben, de volgende twee of meer certificaten moeten een base64-gecodeerde SHA256-hash hebben die is vastgemaakt in het formaat 'pin-sha256='”’. Het laatste verplichte deel is de "max-age", een telling in seconden voor hoe lang de browser de beperkingen moet toepassen.

Tip: SHA256 is het hash-algoritme dat wordt gebruikt door HPKP. Base64 is een tekenset met 64 tekens: 0-9, a-z, A-Z en de speciale tekens "+" en "/". De "=" wordt gebruikt om indien nodig tot de laatste twee tekens op te vullen.

De optionele instellingen zijn "includeSubDomains" en "report-uri". "includeSubDomains instrueert de browser om de HPKP-beveiligingen toe te passen op elk subdomein van de huidige website voor de duur van de "max-age"-timer. "report-uri" is een functie waarmee een website kan worden gespecificeerd waar foutrapporten kunnen worden verzonden, en is ontworpen om problemen te helpen identificeren en oplossen.

Er is een tweede variant van de header met de titel "Public-Key-Pins-Report-Only". Alles is hetzelfde, maar als er een fout wordt gevonden, wordt er geen actie ondernomen behalve het retourneren van een foutmelding naar de browser en naar de "report-uri" als die is geconfigureerd. De variant met alleen rapport is ontworpen om volledige tests van de header mogelijk te maken vóór implementatie, waarbij fouten geen problemen zouden veroorzaken voor gebruikers.

Problemen met HPKP

HPKP is om twee hoofdredenen afgeschaft. Er waren twee manieren waarop de header ernstige problemen kon veroorzaken voor de website die deze gebruikte, deze werden HPKP Suicide en Ransom PKP genoemd.

HPKP Suicide is een probleem waarbij de legitieme eigenaren van de website de toegang tot alle vastgezette sleutels verliezen. Dit kan gebeuren door onbedoelde verwijdering, hacking, virussen, gegevenscorruptie of om vele andere redenen. Vanwege de complexiteit van het correct implementeren van HPKP, en vooral het up-to-date houden ervan tijdens certificaatrotaties, is het relatief eenvoudig om een ​​configuratiefout te maken. Met HPKP wordt echter, als u iets verkeerd doet, alle recente bezoekers van uw website verhinderd toegang tot uw website te krijgen voor de duur van de "max-age"-timer. De website smashingmagazine.com plaatste een artikel het beschrijft zijn ervaring met precies dit probleem, waardoor de site voor de meeste bezoekers vier dagen offline was voordat een oplossing werd geïmplementeerd.

Ransom PKP is een theoretische aanval waarbij een hacker toegang krijgt tot een webserver, vervolgens alle vertrouwde certificaten en sleutels steelt en vervolgens losgeld eist voor hun terugkeer. In een normale configuratie zou je gewoon nieuwe sleutels en certificaten kunnen genereren en de website in minder dan een uur weer up-and-running hebben. Als HPKP is ingeschakeld, zijn die sleutels echter vastgezet. Als u geen vastgezet certificaat aan gebruikers kunt aanbieden, hebben ze geen toegang tot de website voor de duur van de "max-age" -timer. Afhankelijk van de configuratie en als er back-ups zijn, kan het onmogelijk zijn om dit probleem op te lossen.

Met beide problemen zouden nieuwe gebruikers de website normaal kunnen openen, zoals ze dat ook zouden doen heb nog nooit de oude HPKP-header gezien die hun browser instrueerde om alleen de nu ontbrekende te vertrouwen certificaten. Alle recente bezoekers, zoals vaste klanten en lezers, zouden echter moeten wachten op de volledige duur van de "max-age" timer.

Gezien de ernst van deze problemen en de complexiteit van de configuratie en het onderhoud, was het gebruik van de HPKP-header erg laag. Uiteindelijk kwamen grote browsers overeen om de ondersteuning ervoor volledig te laten vallen en binnen een paar jaar was de HPKP-header universeel verouderd.