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 zou uitgeven. 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, het 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 controleren of 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 ten minste twee sleutels worden vastgezet, waarvan er ten minste éé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 aangeboden, niet overeenkomt met een van de vastgezette certificaten, moet de browser het weigeren en voorkomen dat de gebruiker de certificaatfoutmelding omzeilt.
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, az, AZ 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 voor gebruikers zouden veroorzaken.
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 voorkomen dat alle recente bezoekers van uw website toegang krijgen tot uw website voor de duur van de "max-age"-timer als u dingen verkeerd doet. De website smashingmagazine.com plaatste een artikel waarin zijn ervaring met precies dit probleem werd beschreven, waardoor de site voor de meeste bezoekers vier dagen offline was voordat er 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 kunt u gewoon nieuwe sleutels en certificaten 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 vastgemaakt 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, omdat ze de oude HPKP-header nooit zouden hebben gezien die hun browser instrueerde om alleen de nu ontbrekende certificaten te vertrouwen. 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 zeer 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.