Ich möchte den öffentlichen Schlüssel einer Stamm-CA (verisign - http://www.verisign.com/repository/roots/root-certificates/PCA-3G5.pem) in meine iOS App einstecken. Ist es besser, den öffentlichen Schlüssel oder das SubjectPublicKeyInfo anzuheften? Könnte mir bitte jemand erklären, welche Methode besser ist und warum?Zertifikat Pinning - nur öffentlicher Schlüssel?
Antwort
Ich würde argumentieren, dass es besser ist, den öffentlichen Schlüssel des Subjekts als den öffentlichen Schlüssel der Wurzel CA zu pinnen. Hier ist mein Verständnis der verschiedenen Abwägungen der Wurzel pTaste der CA Pinning:
Die gute Solange Sie die gleiche CA halten, können Sie Ihr Zertifikat über aktualisieren und immer wieder und es wird immer funktionieren.
Die schlechte Ich glaube, dass Sie etwas anfälliger für einen MITM-Angriff sein wird, die Wurzeln CA pTaste statt der Probanden öffentlichen Schlüssel Pinning, da Sie als gültig jedes Zertifikat von dieser Zertifizierungsstelle signiert nehmen, statt nur diejenigen, die wirklich zu Ihrem Thema passen.
Wie wäre es dann, den öffentlichen Schlüssel des Subjekts zu fixieren? Grundsätzlich sollten Sie etwas sicherer sein, als den öffentlichen Schlüssel der Zertifizierungsstelle zu fixieren, und Ihre Anwendung sollte auch dann noch funktionieren, wenn das Zertifikat abläuft und Sie es erneuern, solange Sie den gleichen öffentlichen Schlüssel beibehalten.
ich nur eine Frage und Lösung auf gepostet, wie den öffentlichen Schlüssel an Pin, ich hoffe, es hilft Ihnen: How to pin the Public key of a certificate on iOS
Ich möchte den öffentlichen Schlüssel eines Root-CA-Pin ...
Nur Fahrrad Shedding, aber es ist wahrscheinlich sicherer, das Zertifikat oder den öffentlichen Schlüssel des Servers oder der Dienstleistung, und nicht die Wurzel oder ein Zwischenzertifikat Pin. Dies gilt insbesondere dann, wenn Sie eine öffentliche CA wie DigiCert oder Verisign (im Gegensatz zu einer privaten Unternehmens-CA) verwenden.
Im Fall einer öffentlichen Zertifizierungsstelle könnte die Zertifizierungsstelle fälschlicherweise ein zweites Zertifikat ausstellen, und die Clients können das "echte" Zertifikat (das Ihnen ausgestellte) und das "gefälschte" Zertifikat (das ausgegebene Zertifikat) nicht unterscheiden falsch). Dies ist im wirklichen Leben einige Male passiert, also solltest du erwarten, dass es wieder passiert.
Ist es besser, den öffentlichen Schlüssel oder das SubjectPublicKeyInfo anzuheften? Könnte mir bitte jemand erklären, welche Methode besser ist und warum?
Es ist besser, den öffentlichen Schlüssel anzuheften (zumindest im Falle eines Pinnens eines Serverzertifikats).
Einige Organisationen, wie Google, rotieren ihre Serverzertifikate alle 30 Tage oder so. Sie zertifizieren jedoch denselben öffentlichen Schlüssel erneut. Siehe beispielsweise Android 4.2 and Pinning. Das heißt, Sie werden "Schlüsselkontinuität" beobachten, aber nicht "Zertifikatskontinuität".
Die erneute Zertifizierung desselben öffentlichen Schlüssels ist der Grund, warum CertPatrol in einigen Fällen in der Benutzererfahrung so schlecht ausfällt. Wir brauchen wirklich eine Public Key Patrol in Fällen wie Google-Dienste.
Es ist besser, die SPKI (Subject Public Key Info) anzuheften, da sie sowohl den eigentlichen öffentlichen Schlüssel als auch den Algorithmus des Schlüssels (RSA, ECDSA, usw.) enthält. Dies wird in mehr Details in diesem Artikel aus dem Google-TLS-Guru bei https://www.imperialviolet.org/2011/05/04/pinning.html beschrieben:
Die SPKI gehören die Art des öffentlichen Schlüssels und einige Parameter zusammen mit dem öffentlichen Schlüssel selbst. Dies ist wichtig, weil das bloße Hashing des öffentlichen Schlüssels zu Fehlinterpretationen von Angriffen führt. Stellen Sie sich einen öffentlichen Diffie-Hellman-Schlüssel vor: Wenn nur der öffentliche Schlüssel und nicht das vollständige SPKI verwendet wird, kann ein Angreifer den gleichen öffentlichen Schlüssel verwenden, aber vom Client in einer anderen Gruppe interpretiert werden. Ebenso könnte man einen RSA-Schlüssel erzwingen als DSA-Schlüssel interpretiert werden usw.
Eine Herausforderung bei der SPKI innerhalb einer iOS App Pinning ist, dass die Framework-Sicherheit auf iOS nicht APIs bereitstellt für ein Zertifikat Parsen und das Extrahieren SPKI Bits (https://nabla-c0d3.github.io/blog/2015/08/11/security-framework-wish-list/).
Die gute Nachricht ist, als eine Open-Source-Bibliothek zur Verfügung steht, genau das zu tun: https://github.com/datatheorem/TrustKit.