it-swarm.com.de

Unterschied zwischen dem Fixieren von Zertifikaten und dem Fixieren von öffentlichen Schlüsseln

Ich verstehe, was Pinning ist. Ich hatte über das Anheften von Zertifikaten gelesen und wusste den Anwendungsfall zu schätzen. Aber heute habe ich gelernt, dass es zwei Arten von Pinning geben kann -

  1. pin das Zertifikat oder
  2. pin den öffentlichen Schlüssel

Anheften von Zertifikaten und öffentlichen Schlüsseln

Ich möchte die Anwendungsfälle für jeden verstehen. Gibt es typische Szenarien, in denen wir eines dem anderen vorziehen würden?

Ein Zweifel, den ich habe, ist: Nehmen wir an, wir haben einen öffentlichen Schlüssel angeheftet. Ist unsere Verbindung anfällig für MitM-Angriffe? Kann es ein CA-zertifiziertes Stammzertifikat geben, das denselben öffentlichen Schlüssel wie das im Client verwendete Zertifikat hat?

Alle Unterschiede zwischen den beiden, die mir helfen können, sie besser zu verstehen, werden geschätzt.

15
Aniket Thakur

Es hängt wirklich davon ab, wie Ihre Anwendung/Site die Zertifikate und öffentlichen Schlüssel verwaltet, d. H. Wie oft die Schlüssel und Zertifikate gedreht werden. Wenn Ihre Site beispielsweise die Zertifikate sehr häufig wechselt, müssen Sie Ihre Anwendung auch so oft aktualisieren, wenn Sie das Zertifikat anheften. In diesem Anwendungsfall ist das Fixieren des öffentlichen Schlüssels eine bessere Idee, da der dem Zertifikat zugeordnete öffentliche Schlüssel statisch bleibt.

Über den OWASP-Link, den Sie in der Frage erwähnt haben:

Zertifikat

Das Zertifikat ist am einfachsten zu pinnen. Sie können das Zertifikat für die Website außerhalb des Bandes abrufen, die IT-Mitarbeiter Ihr Unternehmenszertifikat per E-Mail an Sie senden lassen, das Zertifikat mit openssl s_client abrufen usw. Wenn das Zertifikat abläuft, würden Sie Ihre Anwendung aktualisieren. Vorausgesetzt, Ihre Anwendung weist keine Fehler oder Sicherheitsmängel auf, wird die Anwendung jedes oder jedes zweite Jahr aktualisiert. Zur Laufzeit rufen Sie die Website oder das Serverzertifikat im Rückruf ab. Innerhalb des Rückrufs vergleichen Sie das abgerufene Zertifikat mit dem im Programm eingebetteten Zertifikat. Wenn der Vergleich fehlschlägt, schlagen Sie die Methode oder Funktion fehl.

Das Anheften eines Zertifikats hat einen Nachteil. Wenn die Site ihr Zertifikat regelmäßig wechselt, muss Ihre Anwendung regelmäßig aktualisiert werden. Beispielsweise dreht Google seine Zertifikate, sodass Sie Ihre Anwendung etwa einmal im Monat aktualisieren müssen (sofern dies von den Google-Diensten abhängt). Obwohl Google seine Zertifikate dreht, bleiben die zugrunde liegenden öffentlichen Schlüssel (innerhalb des Zertifikats) statisch.

öffentlicher Schlüssel

Das Fixieren von öffentlichen Schlüsseln ist flexibler, jedoch aufgrund der zusätzlichen Schritte zum Extrahieren des öffentlichen Schlüssels aus einem Zertifikat etwas schwieriger. Wie bei einem Zertifikat überprüft das Programm den extrahierten öffentlichen Schlüssel mit seiner eingebetteten Kopie des öffentlichen Schlüssels. Es gibt zwei Nachteile, zwei das Feststecken von öffentlichen Schlüsseln. Erstens ist es schwieriger, mit Schlüsseln (im Vergleich zu Zertifikaten) zu arbeiten, da Sie normalerweise den Schlüssel aus dem Zertifikat extrahieren müssen. Das Extrahieren ist eine geringfügige Unannehmlichkeit in Java und .Net, aber in Cocoa/CocoaTouch und OpenSSL unangenehm. Zweitens ist der Schlüssel statisch und verstößt möglicherweise gegen Richtlinien zur Schlüsselrotation.

Nein, Ihre TLS-Verbindung ist für MitM-Angriffe nicht anfällig, solange Sie das Anheften des Zertifikats korrekt implementiert haben. Selbst wenn ein Angreifer in der Lage ist, ein gültiges Zertifikat für seine eigene Domain mit demselben öffentlichen Schlüssel zu erhalten, den Ihre Anwendung gepinnt hat (beispielsweise über eine Rouge-Zertifizierungsstelle) ) haben sie immer noch nicht den entsprechenden privaten Schlüssel . Daher kann keine gültige TLS-Verbindung mit Ihrer Anwendung hergestellt werden (da diese selbst keinen TLS-Handshake ausführen können).

13
Rahil Arora

Das große Problem beim Anheften von Zertifikaten besteht darin, dass Zertifikate nur eine begrenzte Haltbarkeit haben und häufig Geld kosten. Kostenlose Zertifikate von lassen uns nur 90 Tage verschlüsseln. Wenn Sie Geld bezahlen, können Sie etwas mehr als zwei Jahre erhalten, was das Limit ist, das heutzutage vom CA/Browser-Forum festgelegt wird. Es gibt keine Garantie, dass dies in Zukunft nicht weiter reduziert wird.

Sie können ein Zertifikat erst anheften, wenn Sie es gekauft haben. Sobald Sie es gekauft haben, läuft die Lebensdauer ab, ob Sie es verwenden oder nicht. Wenn Sie also Zertifikate anheften, werden Sie wahrscheinlich viele zusätzliche Zertifikate kaufen und wahrscheinlich Probleme mit Personen haben, die versuchen, eine Verbindung mit alten Versionen Ihres Codes herzustellen.

Auf der anderen Seite haben öffentliche Schlüssel keine lebenslange Einschränkung. Wenn Sie also das Fixieren von Schlüsseln verwenden, können Sie ein Schlüsselpaar generieren, den privaten Schlüssel in Ihrem Tresor und den öffentlichen Schlüssel in Ihrer App ablegen. Jahre später können Sie den privaten Schlüssel aus Ihrem Tresor ziehen, ein Zertifikat erhalten und es in Betrieb nehmen.

Der mögliche Nachteil des Fixierens von Schlüsseln besteht darin, dass keine Sperrung für Schlüssel erfolgt. Wenn Ihre Schlüssel kompromittiert sind, können Sie die Zertifikate widerrufen, aber ein Angreifer mit einer freundlichen Zertifizierungsstelle könnte möglicherweise ein neues Zertifikat mit dem gestohlenen Schlüssel erhalten. Der Widerruf des OTOH-Zertifikats ist im Allgemeinen ziemlich fragil.

1
Peter Green

Nur einige meiner zwei Cent:

Ich könnte mir vorstellen, dass das Fixieren von öffentlichen Schlüsseln in Szenarien verwendet wird, in denen es schwierig sein kann, die Anwendung zu aktualisieren, wenn das Zertifikat erneuert wird (z. B. in eingebetteten Systemen oder IoT-Anwendungen). Andernfalls wäre das Anheften von Zertifikaten bequemer.

Wenn die öffentlichen Schlüssel mit ausreichender Entropie generiert werden, ist es unwahrscheinlich, dass zwei Schlüssel gleich sind.

0
clouddra