Die Verwendung von SSL auf Ihrer Website ist ein wichtiger Schritt, um die Sicherheit und den Datenschutz für Ihre Nutzer zu gewährleisten. Die Aktivierung von SSL ist aber nicht das Ende der Fahnenstange: Es gibt viele Möglichkeiten, die Sicherheit Ihrer Website weiter zu verbessern. Dazu gehören das Festlegen des Attributs „Secure“ für Ihre Cookies, die Aktivierung von HTTP Strict Transport Security oder die Verwendung der Content Security Policy, um die Berechtigungen Ihrer Website einzuschränken. Die Implementierung dieser leistungsstarken Funktionen kann jedoch manchmal schwierig sein. Chrome 46 enthält die Funktion „HPKP-Berichte“, die Ihnen beim Einrichten einer strengeren SSL-Version helfen kann.
Was bedeuten all diese Akronyme?
Die Sicherheit im Web basiert heute auf SSL-Zertifikaten: Kryptografische Signaturen, die belegen, dass eine Website die ist, für die sie sich ausgibt. Wenn Ihr Browser eine Anfrage an eine URL wie https://developers.google.com sendet, stellt der Server ein SSL-Zertifikat bereit. Wenn das Zertifikat gültig ist, lässt der Browser die Anfrage zu und zeigt die Website-URL mit einem grünen Schloss in der Adressleiste an.
Was ist aber ein gültiges Zertifikat? Damit ein Zertifikat als gültig gilt, muss es von einer Zertifizierungsstelle (Certificate Authority, CA) oder von einem anderen Zertifikat signiert sein, das von einer Zertifizierungsstelle signiert wurde (eine sogenannte Zwischenzertifizierungsstelle). Browser und Betriebssysteme werden mit einer Liste von mehreren hundert Zertifizierungsstellen ausgeliefert, die zum Ausstellen von Zertifikaten vertrauenswürdig sind. Das Problem ist jedoch, dass standardmäßig jede dieser Zertifizierungsstellen Zertifikate für jede Website ausstellen kann. Wenn einer davon manipuliert wird oder sich nicht richtig verhält, kann das verheerende Auswirkungen auf das gesamte Web haben.
Geben Sie „HTTP Public Key Pinning“ (HPKP) ein. Mit diesem Standard können Websites einen HTTP-Header senden, der den Browser anweist, Teile der SSL-Zertifikatskette zu speichern (oder „anzupinnen“). Der Browser lehnt dann nachfolgende Verbindungen ab, die nicht mit den zuvor empfangenen Pins übereinstimmen. Hier ein Beispiel für eine HPKP-Headerzeile:
Public-Key-Pins:
pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
max-age=259200
In diesem Header werden zwei Zertifikatshasche als PINs angegeben. Eine davon ist ein Hash eines Zertifikats in der Zertifikatskette der Website und die andere ist eine Sicherungs-PIN oder ein Hash eines Zertifikats, das die Website verwenden kann, falls das Zertifikat rotiert werden muss. Der Header enthält auch einen max-age
-Wert. Nach Ablauf dieser Zeitspanne wird die PIN vom Browser gelöscht.
Weitere Informationen zu HPKP finden Sie in der Spezifikation oder im Blogpost von Chris Palmer, einem anderen Chrome-Entwickler.
Soll ich HPKP jetzt aktivieren?
Nicht unbedingt. Wenn Sie HPKP implementieren, ist es ziemlich einfach, einen Fehler zu machen und Ihre Website versehentlich durch einen Denial-of-Service-Angriff lahmzulegen. Wenn Sie Ihre Website an eine Gruppe von Zertifikaten anpinnen und dann ein neues bereitstellen müssen, können Nutzer, die die Markierung gesehen haben, erst dann auf Ihre Website zugreifen, wenn die Markierung abgelaufen ist (basierend auf dem max-age
-Wert in der Kopfzeile).
Da es schwierig ist, die richtige Konfiguration zu finden, wird HPKP derzeit hauptsächlich von einer Handvoll bekannter, sicherheitssensibler Websites verwendet. Wenn Sie HPKP aktivieren, sollten Sie mit einem sehr kurzen Max-Age-Wert beginnen und ihn schrittweise erhöhen, wenn keine Probleme auftreten.
Was sind HPKP-Berichte und wie helfen sie?
Mit den HPKP-Berichten, die in Chrome 46 eingeführt wurden, können Sie Fehlkonfigurationen beim Roll-out von HPKP erkennen.
Sie können zuerst die Public-Key-Pins-Report-Only
-Header-Anfrage statt der Public-Key-Pins-Anfrage senden:
Public-Key-Pins-Report-Only:
max-age=2592000;
pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
report-uri="https://example.net/pkp-report"
Wenn Ihre Website eine solche Kopfzeile sendet, prüft Chrome, ob die aktuelle Verbindung mit den Markierungen übereinstimmt. Andernfalls wird ein Bericht an die report-uri
gesendet. Chrome blockiert niemals Anfragen basierend auf den Pins in einer „Nur-Meldung“-Header. Dies ist also eine sichere Möglichkeit, HPKP zu testen und zu sehen, ob es Probleme für Ihre Nutzer verursacht, ohne das Risiko eines DDoS-Angriffs auf Ihre Website zu laufen.
Hinweis: Ein Header vom Typ „Nur Bericht“ gilt nur für die Anfrage, auf die er empfangen wird. Der Browser merkt sich nur für echte Markierungen die Position, nicht für Markierungen vom Typ „Nur melden“. So können Sie Ihre Konfiguration testen, ohne sich Gedanken über das Caching fehlerhafter Werte in den Browsern Ihrer Nutzer machen zu müssen. Außerdem können Sie die Implementierung schrittweise vornehmen (z. B. nur für eine einzelne Ressource), um zu vermeiden, dass Ihr Server mit Berichten überlastet wird.
Wenn Sie die echte Public-Key-Pins
-Überschrift einführen, um Ihre Markierungen durchzusetzen, können Sie auch einen Wert für „report-uri“ in diese Überschrift aufnehmen, damit Sie weiterhin Berichte erhalten, wenn Probleme auftreten.
Was gehört in einen HPKP-Verstoßbericht?
Ein HPKP-Verstoßbericht ist eine JSON-Nachricht, die in einer HTTP-POST-Anfrage an Ihre konfigurierte report-uri
gesendet wird. Die Liste der Felder finden Sie in der Spezifikation. Ich möchte hier aber zwei davon hervorheben: served-certificate-chain
und validated-certificate-chain
. Das served-certificate-chain
ist das Zertifikat, das Chrome beim Einrichten der SSL-Verbindung für die Anfrage genau so erhalten hat. Die validated-certificate-chain
ist dagegen die Kette, die Chrome beim Versuch, das Zertifikat des Servers zu validieren, neu erstellt hat. Sie kann sich überraschenderweise von der served-certificate-chain
unterscheiden. Unterschiedliche Clients führen die Zertifikatsvalidierung auf unterschiedliche Weise durch. Dies kann eine häufige Ursache für HPKP-Fehlkonfigurationen sein. Setzen Sie ein Häkchen in dieses Feld, wenn Sie unerwartete Meldungen erhalten.
Noch ein letzter Hinweis
Wenn Sie HPKP-Berichte implementieren, denken Sie daran, dass Chrome die PIN für alle Anfragen validiert, einschließlich Anfragen zum Senden von Berichten. Wenn Sie HPKP für Ihre Website implementiert haben, sollten Sie HPKP-Berichte an eine andere Domain senden, die Sie nicht angepinnt haben. Andernfalls wird bei einem Verstoß gegen die Markierung auf Ihrer Website eine Meldung an dieselbe Domain gesendet, die ebenfalls als Verstoß gegen die Markierung eingestuft wird. Sie erhalten dann keine Meldung.
Wenn Sie keine andere Domain zur Hand haben, können Sie stattdessen einen Dienst wie report-uri.io verwenden, der Meldungen zu Verstößen für Sie bearbeitet.