Wie kann ich das implementieren von SSL-Zertifikat-Pinning während der Verwendung Reagieren Nativen
Muss ich implementieren von SSL-Zertifikat-Pinning in meine reagieren nativen Anwendung.
Ich weiß sehr wenig über SSL/TLS, geschweige denn festhalten.
Ich bin auch kein native mobile-Entwickler, obwohl ich weiß, dass Java und gelernt, Objective-C an diesem Projekt genug, um zu bekommen.
Ich begann mit der Suche nach, wie Sie diese Aufgabe auszuführen.
Nicht Reagieren Nativen bereits diese umzusetzen?
Nein, Meine erste Suche führt mich zu dieser Vorschlag hat keine Aktivität seit 2. August 2016.
Daraus habe ich gelernt, dass reagieren-native verwendet, OkHttp, die unterstützt Anpinnen, aber ich wäre nicht in der Lage, um es auszuziehen von Javascript, das ist nicht wirklich eine Voraussetzung, aber ein plus.
Die Implementierung in Javascript.
Während reagieren scheint, wie es verwendet die nodejs-Laufzeit, es ist mehr wie ein browser als Knoten, das heißt, es unterstützt nicht alle native-Module, speziell das https-Modul, für die ich hatte umgesetzt Zertifikats-pinning folgenden dieser Artikel. Somit könnte nicht es tragen zu reagieren nativen.
Versuchte ich mit rn-nodeify aber die Module nicht funktionierte. Dies ist gilt, da RN 0.33 RN 0.35 die ich derzeit auf.
Umsetzung mit phonegap plugin
Ich daran gedacht, mit einem phongape-plugin allerdings habe ich da eine Abhängigkeit von Bibliotheken erfordern, reagieren 0.32+ ich kann nicht mit reagieren-native-cordova-plugin
Tun Sie es einfach nativ
Während ich bin nicht einer nativen app-Entwickler, ich kann immer nehmen Sie einen Riss an Sie, nur eine Frage der Zeit.
Android-certificate pinning
Erfuhr ich, dass android unterstützt SSL-Pinning war jedoch erfolglos, wie es scheint, dass dieser Ansatz funktioniert nicht, Vor der Android-7. Sowie funktioniert nur für android.
Der unteren Zeile
Ich erschöpft haben verschiedene Richtungen und wird weiterhin mehr native Umsetzung, vielleicht herauszufinden, wie Sie zu konfigurieren, OkHttp und RNNetworking dann vielleicht die überbrückung zurück zu reagieren,-Muttersprachler.
Aber ist es schon Implementierungen oder guide für IOS und android?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach Ausschöpfung der aktuellen Spektrum der verfügbaren Optionen aus Javascript, habe ich beschlossen, einfach zu implementieren Zertifikat-pinning nativ es scheint alles so einfach jetzt, dass ich fertig bin.
Android
Folgenden Kudo ' s Empfehlung ich dachte, sich an die Umsetzung pinning mit okhttp3.
Ich anfing, indem Sie lernen, erstellen Sie eine native android-Brücke mit reagieren nativenerstellen einer toast-Modul. Ich habe dann erweitert es mit einer Methode für das senden einer einfachen Anfrage
Erfolg bei senden einer Anfrage, die ich dann gedreht, um das senden einer Anfrage angeheftet.
Verwendet habe ich diese Pakete in meiner Datei
Kudo ' s Ansatz war nicht klar, wo ich den öffentlichen Schlüssel oder wie diese zu generieren. zum Glück okhttp3 docs neben der Bereitstellung einer klaren demonstration der Verwendung der CertificatePinner erklärte, dass, um die öffentlichen Schlüssel und alles was ich tun müssen, ist senden Sie eine Anfrage mit einem falschen pin ein, und die richtigen pins wird in der Fehlermeldung angezeigt.
Nach der Einnahme einen moment, um zu realisieren, dass OkHttpClent.- Generator() können verkettet werden, und ich kann die CertificatePinner vor dem bauen, im Gegensatz zu den irreführenden Beispiel in Kudo ' s Vorschlag (und wahrscheinlich ältere version) ich kam mit dieser Methode.
Dann ersetzt das öffentliche Schlüsselanhänger habe ich in der Fehler ergab sich wieder die Seite des Körpers, der angibt, hatte ich eine erfolgreiche Anfrage, ändere ich einen Brief von der Taste, um sicherzustellen, dass es Arbeit war und ich wusste, ich war auf der Strecke.
Endlich habe ich diese Methode in meine ToastModule.java Datei
Android-Lösung, die sich Reagieren Native OkHttpClient
Haben herausgefunden, wie zum senden angeheftet http-Anforderung war gut, jetzt kann ich die Methode verwenden, die ich erstellt habe, aber im Idealfall dachte ich, es wäre am besten, um eine Erweiterung der existierenden client, so dass Sie sofort profitieren von der Umsetzung.
Diese Lösung ist gültig ab
RN0.35
und ich weiß nicht, wie es wird fair in die Zukunft.Beim Blick auf die Möglichkeiten für eine Ausweitung der OkHttpClient für RN stieß ich auf dieser Artikel erklären, wie das hinzufügen von TLS 1.2-Unterstützung durch austauschen der SSLSocketFactory.
Lesen lernte ich reagieren, verwendet eine OkHttpClientProvider für die Erstellung der OkHttpClient Instanz vom XMLHttpRequest-Objekt und daher, wenn wir ersetzen Sie das Beispiel, würden wir gelten pinning, um alle der app.
Ich habe eine Datei namens
OkHttpCertPin.java
zu meinemandroid/app/src/main/java/com/dreidev
OrdnerDieses Paket hat eine Methode erweitern, die dauert ein vorhandenes OkHttpClient und Umbauten, durch die certificatePinner und gibt die neu gebaute Beispiel.
Ich dann meine modifizierten MainActivity.java Datei folgenden diese Antwort ist Beratung durch hinzufügen der folgenden Methoden
Diese Lösung wurde durchgeführt, zu Gunsten von ganz reimplementing die OkHttpClientProvider createClient Methode, wie das prüfen der Anbieter erkannte ich, dass die master-version hatte implementiert TLS 1.2 zu unterstützen, aber noch nicht eine verfügbare option für mich zu nutzen, und so den Wiederaufbau zu finden, um das beste Mittel zur Erweiterung des client. Ich Frage mich, wie dieser Ansatz fair, da ich aktualisieren, aber jetzt funktioniert es gut.
Update Es scheint, dass ab 0.43 dieser trick nicht mehr funktioniert. Für timebound Gründen werde ich einfrieren mein Projekt mit 0,42 für jetzt, bis der Grund für Wiederaufbau aufgehört zu arbeiten, ist klar.
Lösung IOS
Für IOS ich hatte gedacht, dass ich brauchen würde, um Sie eine ähnliche Methode, wieder beginnend mit Kudo ' s Vorschlag als meinen führen.
Prüfung der RCTNetwork Modul habe ich gelernt, dass NSURLConnection verwendet wurde, so dass anstatt zu versuchen, zu erstellen ein komplett neues Modul mit AFNetworking, wie vorgeschlagen, in den Vorschlag, den ich entdeckt TrustKit
folgenden seine Erste Schritte habe ich einfach Hinzugefügt
meiner podfile und lief
pod install
den GettingStartedGuide erklärte, wie ich dies konfigurieren-pod aus meiner pList.Datei aber lieber code verwenden, als die Konfiguration-Dateien, die ich Hinzugefügt die folgenden Zeilen zu meiner AppDelegate.m-Datei
Bekam ich die public-key-hashes von meinem android-Umsetzung und es funktionierte einfach (die version von TrustKit erhielt ich in meinem Hülsen ist 1.3.2)
War ich froh, dass IOS sich herausstellte, Atem
Abschluss
Diese Antwort stellt die Lösung für Android und IOS, da war ich in der Lage, implementieren diese in nativen code.
Eine mögliche Verbesserung könnte sein, Umsetzung einer gemeinsamen Plattform Modul, in dem die Einstellung der öffentlichen Schlüssel und die Konfiguration der Netzwerk-Provider von android und IOS verwaltet werden können, ist in javascript.
Kudo ' s Vorschlag erwähnt einfach hinzufügen die öffentlichen Schlüssel der js-bundle kann jedoch über eine Sicherheitsanfälligkeit, wo irgendwie der bundle-Datei, die ersetzt werden können.
Ich weiß nicht, wie, die Sie angreifen, kann der Vektor-Funktion, die aber sicherlich der zusätzliche Schritt, der Unterzeichnung des bundle.js wie vorgeschlagen, kann schützen die js-bundle.
Ein weiterer Ansatz könnte sein, einfach codieren Sie die js-bundle in 64 bit-string und fügen Sie es in das native-code direkt als die in dieser Ausgabe erwähnt Gespräch. Dieser Ansatz hat den Vorteil der Verschleierung als auch festverdrahtung der js-bundle in der app, so dass es unzugänglich für Angreifer oder so, denke ich.
Wenn Sie bis hierher gelesen-ich hoffe, ich erleuchtete du auf der Suche nach Festsetzung Ihre Fehler und wollen Sie genießen Sie einen sonnigen Tag.
fetch
API in Android. Wenn Sie eine Anfrage mit derXMLHttpRequest
API das Zertifikat pinner werden ignoriert.Können Sie diese lib https://github.com/nlt2390/react-native-pinning-ssl
Überprüft SSL-Verbindung mit SHA1 Schlüssel, nicht die Zertifikate.
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }
"Failed isSSLValid$ index.js 10:10"
ich hatte zum ändern der compileSdkVersion = 26 in die Halterung zu integrieren in mein Projekt