HPKP ist ein veralteter Web-Security-Response-Header, das Akronym steht für HTTP Public Key Pins. Es sollte verhindern, dass eine kompromittierte oder betrügerische Zertifizierungsstelle ein öffentlich vertrauenswürdiges, aber von Hackern kontrolliertes HTTPS-Zertifikat für eine Website ausstellt. In diesem Szenario könnten die Hacker jeden abgefangenen HTTPS-Datenverkehr zur betroffenen Website entschlüsseln.
Tipp: Web-Antwort-Header sind Metadaten, die der Server einschließt, wenn er auf Anfragen antwortet. Eine kleine Teilmenge davon wird als Sicherheitsheader bezeichnet, da sie verschiedene Sicherheitsfunktionen aktivieren und konfigurieren.
HTTPS-Zertifikatsinfrastruktur
Die Zertifikatsinfrastruktur, auf der HTTPS aufgebaut ist, basiert auf einem Web of Trust. Eine Reihe von Unternehmen fungieren als Zertifizierungsstellen (CA), die ein oder mehrere Wurzelzertifikate veröffentlichen. Ein Satz von Root-Zertifikaten ist in allen Geräten in einem Truststore enthalten. Wenn eine Website ein eigenes HTTPS-Zertifikat von einer CA anfordert, wird das Zertifikat von einem Root-Zertifikat signiert. Wenn Ihr Computer ein HTTPS-Zertifikat sieht, überprüft er die Signatur. Wenn das Zertifikat von einem vertrauenswürdigen Stammzertifikat signiert ist, vertraut Ihr Computer auch dem HTTPS-Zertifikat.
Tipp: Eine CA kann auch Zwischenzertifikate haben, die vom Stammzertifikat signiert sind. Diese Zwischenzertifikate können auch zum Signieren von HTTPS-Zertifikaten für Websites verwendet werden.
Die Aufgabe einer Zertifizierungsstelle besteht darin, ein Zertifikat nur dann auszustellen, wenn sie überprüft hat, dass die anfordernde Person der echte Eigentümer der Website ist. Die Idee bei dieser Struktur ist, dass wenn ein Hacker sein eigenes Zertifikat für eine Website erstellt, es nicht von einer CA signiert wird, der Ihr Computer vertraut, und Sie erhalten daher eine Warnung.
Was hat HPKP gemacht?
Das gesamte Zertifikatssystem beruht auf der Vertrauenswürdigkeit der Zertifizierungsstellen. Ursprünglich gab es jedoch keinen Schutz davor, dass eine Zertifizierungsstelle von Hackern kompromittiert oder abtrünnig wird und sich für die falsche Ausstellung von Zertifikaten entscheidet.
HPKP wurde als Schutz vor dieser Möglichkeit entwickelt. Es ermöglicht Websites, eine exklusive Liste von Zertifikaten anzugeben, die für die Website in einem Prozess namens Anheften vertrauenswürdig sind. Es war möglich, das Stamm- oder Zwischenzertifikat anzuheften, sodass eine einzelne Zertifizierungsstelle im Wesentlichen Zertifikate für die Website ausstellen konnte. Es war auch möglich, das Zertifikat der Website selbst zu pinnen, wodurch selbst die richtige CA daran gehindert wurde, ein weiteres gültiges Zertifikat auszustellen.
Technisch gesehen wird nicht das Zertifikat selbst angepinnt, sondern ein Hash des Zertifikatsschlüssels. Ein Hash ist eine kryptographische Einwegfunktion. Dies bedeutet, dass es möglich ist zu überprüfen, ob das dem Browser von der Website vorgelegte Zertifikat mit einem angehefteten Zertifikat übereinstimmt, aber es ist nicht möglich, den Hash zu verwenden, um ein gültiges Zertifikat zu erstellen.
HPKP erforderte das Anheften von mindestens zwei Schlüsseln, von denen mindestens einer ein Backup sein muss und nicht in der aktuellen Zertifikatskette enthalten ist. Mit dieser Sicherung können Sie eine reibungslose Übergabe an ein neues Zertifikat konfigurieren, die Benutzer nicht daran hindert, eine Verbindung herzustellen.
Wenn das HTTPS-Zertifikat, das dem Browser von der Website präsentiert wird, nicht mit einem der angehefteten Zertifikate, dann muss der Browser es ablehnen und verhindern, dass der Benutzer das Zertifikat umgeht Fehlermeldung.
Struktur von HPKP
Der HPKP-Header besteht aus drei obligatorischen Teilen und zwei optionalen. Der Header muss mit „Public-Key-Pins“ betitelt sein, die nächsten zwei oder mehr Zertifikate müssen einen base64-codierten SHA256-Hash haben, der im Format „pin-sha256=“ gepinnt ist.
Tipp: SHA256 ist der von HPKP verwendete Hashing-Algorithmus. Base64 ist ein Zeichensatz mit 64 Zeichen: 0-9, a-z, A-Z und den Sonderzeichen „+“ und „/“. Das „=“ wird verwendet, um bei Bedarf bis zu den letzten beiden Zeichen aufzufüllen.
Die optionalen Einstellungen sind „includeSubDomains“ und „report-uri“. „includeSubDomains weist den Browser an, den HPKP-Schutz für die Dauer des „max-age“-Timers auf jede Subdomain der aktuellen Website anzuwenden. „report-uri“ ist eine Funktion, die es ermöglicht, eine Website anzugeben, an die Fehlerberichte gesendet werden können, und soll helfen, Probleme zu identifizieren und zu beheben.
Es gibt eine zweite Variante des Headers mit dem Titel „Public-Key-Pins-Report-Only“. Alles ist gleich, wenn jedoch ein Fehler gefunden wird, wird keine Aktion ausgeführt, außer der Rückgabe einer Fehlermeldung an den Browser und an die „report-uri“, falls eine konfiguriert ist. Die reine Berichtsvariante wurde entwickelt, um ein umfassendes Testen des Headers vor der Bereitstellung zu ermöglichen, bei dem Fehler keine Probleme für die Benutzer verursachen würden.
Probleme mit HPKP
HPKP wurde aus zwei Hauptgründen eingestellt. Es gab zwei Möglichkeiten, wie der Header ernsthafte Probleme für die Website verursachen konnte, die ihn verwendet, diese wurden HPKP Suicide und Ransom PKP genannt.
HPKP Suicide ist ein Problem, bei dem die rechtmäßigen Besitzer der Website den Zugriff auf alle angehefteten Schlüssel verlieren. Dies kann durch versehentliches Löschen, Hacken, Viren, Datenbeschädigung oder viele andere Gründe passieren. Aufgrund der Komplexität der korrekten Implementierung von HPKP und insbesondere der Aktualisierung während der Zertifikatsrotation ist es relativ einfach, einen Konfigurationsfehler zu machen. Wenn Sie jedoch mit HPKP etwas falsch machen, werden alle letzten Besucher Ihrer Website für die Dauer des „Max-Age“-Timers daran gehindert, auf Ihre Website zuzugreifen. Die Website smashingmagazine.com hat einen Artikel detailliert seine Erfahrungen mit genau diesem Problem, das die Site für die meisten Besucher vier Tage lang offline geschaltet hat, bevor ein Fix bereitgestellt wurde.
Ransom PKP ist ein theoretischer Angriff, bei dem sich ein Hacker Zugang zu einem Webserver verschafft, dann alle vertrauenswürdigen Zertifikate und Schlüssel stiehlt und dann ein Lösegeld für deren Rückgabe verlangt. In einem normalen Setup könnten Sie einfach neue Schlüssel und Zertifikate generieren und die Website in weniger als einer Stunde wieder zum Laufen bringen. Wenn HPKP aktiviert ist, sind diese Schlüssel jedoch angeheftet. Wenn Sie Benutzern kein angeheftetes Zertifikat bereitstellen können, können sie für die Dauer des „Max-Age“-Timers nicht auf die Website zugreifen. Abhängig von der Konfiguration und wenn Backups vorhanden sind, kann dieses Problem möglicherweise nicht behoben werden.
Bei beiden Problemen könnten neue Benutzer wie gewohnt auf die Website zugreifen habe noch nie den alten HPKP-Header gesehen, der ihren Browser anweist, nur den jetzt fehlenden zu vertrauen Zertifikate. Alle bisherigen Besucher, wie Stammkunden und Leser, müssten jedoch die gesamte Dauer des „max-age“-Timers warten.
Angesichts der Schwere dieser Probleme und der Komplexität der Konfiguration und Wartung war die Verwendung des HPKP-Headers sehr gering. Schließlich stimmten die großen Browser zu, die Unterstützung dafür vollständig einzustellen, und innerhalb weniger Jahre war der HPKP-Header allgemein veraltet.