Programmatisch eine Zertifizierungsstelle hinzufügen, während Android-System-SSL-Zertifikate beibehalten werden

9

Es gibt viele Fragen zu diesem Thema in StackOverflow, aber ich finde keine, die sich auf mein Problem beziehen.

Ich habe eine Android-Anwendung, die mit HTTPS-Servern kommunizieren muss: Einige sind mit einer im Keystore des Android-Systems registrierten CA (gemeinsame HTTPS-Websites) und einige mit einer eigenen CA, aber nicht im Keystore des Android-Systems (a Server mit einem automatisch signierten Zertifikat für Beispiel).

Ich weiß, wie ich meine CA programmatisch hinzufügen und jede HTTPS-Verbindung erzwingen kann, um sie zu verwenden. Ich benutze den folgenden Code:

%Vor%

Dadurch wird jedoch die Verwendung des Schlüsselspeichers des Android-Systems deaktiviert, und ich kann HTTPS-Sites, die mit einer anderen CA signiert sind, nicht mehr abfragen.

Ich habe versucht, meine Zertifizierungsstelle im Android Keystore hinzuzufügen:

%Vor%

... aber ich kann dann meine CA nicht hinzufügen (eine Ausnahme wird gestartet).

Ich könnte die Instanzmethode HttpsURLConnection.setSSLSocketFactory(...) anstelle der statischen globalen HttpsURLConnection.setDefaultSSLSocketFactory(...) verwenden, um fallweise zu sagen, wann meine CA verwendet werden muss.

Aber es ist überhaupt nicht praktikabel, umso mehr, als ich manchmal ein vorkonfiguriertes HttpsURLConnection -Objekt nicht an einige Bibliotheken weitergeben kann.

Einige Ideen, wie ich das machen könnte?

BEARBEITEN - ANTWORT

Ok, dem gegebenen Rat folgend, hier ist mein Arbeitscode. Es könnte einige Verbesserungen benötigen, aber es scheint als Ausgangspunkt zu funktionieren.

%Vor%     
Vincent Hiribarren 19.12.2014, 09:04
quelle

2 Antworten

3

Versuchen Sie, einen benutzerdefinierten Trust-Manager zu implementieren, so dass er Ihre benutzerdefinierten Zertifikate überprüft, und wenn dies fehlschlägt android eingebaute Zertifikate.

Sehen Sie sich diesen Artikel an: Verwenden eines Truststore für benutzerdefinierte Zertifikate auf Android .

Ich denke, der Absatz "Einen dynamischen TrustManager erstellen" behandelt genau das, was Sie fragen.

    
Okas 19.12.2014, 09:32
quelle
-1

Dies könnte zu spät sein, aber dies ist ein bewährter Ansatz, mit dem die von Java durchgeführte Zertifikatsprüfung umgangen werden kann.

Ich kann keinen Kredit für diesen Code beanspruchen, er wurde von einem meiner Kollegen geschrieben :). Es kann während der Entwicklung verwendet werden, um Ihren Code zu testen. Falls Sie überhaupt keine Zertifikate verwenden möchten, können Sie für jedes HttpURLConnection-Objekt immer von jedem Host Java-Zertifikate erstellen. Das scheint genau das zu sein, was Sie hier versuchen.

Hier ist eine Klasse, die Ihnen dabei helfen soll:

%Vor%

Sie müssen lediglich die Funktion relaxHostChecking () wie folgt aufrufen:

%Vor%

Dies führt dazu, dass Java dem jeweiligen Host, mit dem Sie versuchen, eine Verbindung herzustellen, mit HttpURLConnection vertraut.

    
Aditya Satyavada 01.06.2016 08:01
quelle