Überwachung des HTTPS-Datenverkehrs zwischen einem Android-Gerät und einem externen Server
Schwierigkeiten erscheinen bei der Überwachung des Datenverkehrs zwischen einem Android-Gerät und einem externen Server. Mit dem codierten (HTTP-) Verkehr ist alles ziemlich offensichtlich (hier ist eine Anleitung) — externe Links sind mit Fiddler2 erlaubt, in Android ist die Adresse unserer Maschine mit Fiddler2 als Server festgelegt — und voila, alles ist ok und läuft. Aber es hat bei mir etwas länger gedauert, bis die Überwachung des HTTPS-Datenverkehrs eingerichtet war.
Theorie
Also, was ist das Problem? Das Problem ist, dass der Client bei HTTPS standardmäßig überprüft, ob der Server, mit dem die Verbindung hergestellt wird, der richtige ist. Zu diesem Zweck werden Zertifikate verwendet. Also hat der reale Server, natürlich, ein echtes Zertifikat, das der offenen URL entspricht, während unser Proxy keins hat. Um das Problem in Desktop-Betriebssystemen zu umgehen, bietet Fiddler2 die Möglichkeit, ein gefälschtes Zertifikat zu generieren und es bei den vertrauenswürdigen Zertifikaten zu importieren — jetzt wird der Client immer glauben, dass die Verbindung zu Fiddler2 ziemlich sicher ist. Leider kaufen mobile Geräte einem diese Fälschung nicht ab.
In erster Linie ist es unmöglich, Zertifikate bei Android-Betriebssystemen zu importieren, die älter als v.4.0 sind. Es gibt einige zweifelhafte Optionen mit gerouteten Geräten, aber diese passen nicht zu uns. Zweitens ist es sogar unmöglich, ein Fiddler2-Zertifikat bei Android 4.0 zu importieren. Die Sache ist, dass das standardmäßig generierte Zertifikat einige Sicherheitskriterien von Android nicht erfüllt und daher nicht installiert werden kann. Es sollte auf besondere Weise generiert werden. Schließlich können wir es nicht für selbstverständlich halten, dass alle Anwendungen einem gefälschten Zertifikat trauen werden. Da gibt es einige Feinheiten.
Verwendung
Also, mit dem Browser hat es geklappt, aber leider sind nicht alle Anwendungen so zutraulich wie der Browser. Meine Software z.B., wo ich den Apache HTTP Client verwendet habe, hat das nicht geschluckt, der Apache-Client könnte sich kaum weniger um die betriebssystemkonforme Zertifikate kümmern. In diesem Fall hatte ich diese Überprüfung manuell wie folgt deaktivieren müssen:
Protocol.registerProtocol("https", new Protocol("https", new EasySSLProtocolSocketFactory(), 443));
wo EasySSLProtocolSocketFactory erlaubt, allen Zertifikaten zu vertrauen.
Nicht sicher! Nur fürs Debuggen!
Danach wurde der Datenverkehr meiner Anwendung in Fiddler2 erfolgreich sichtbar.