Android SocketIO mit eigenem Zertifikat

arpi

Mitglied
Hi Leute,

für eine kleine Chat-Anwendung verwende ich folgende Librarys:

Server:
Socket.IO

Client:
https://github.com/nkzawa/socket.io-client.java

An sich klappt das ganze auch ohne Probleme aber um das ganze ein bisschen sicher zu gestalten würde ich die Verbindung gerne über https laufen lassen.

Für meine Testumgebung habe ich natürlich kein gültitiges Zertifikat und ich bin im internet auf folgenden Code gestoßen:
Java:
public SSLContext createSSLContext() throws GeneralSecurityException, IOException {
        Security.insertProviderAt(new BouncyCastleProvider(), 1);

        try {
              TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                @Override
                public void checkClientTrusted(X509Certificate[] certs, String authType) {
                }

                @Override
                public void checkServerTrusted(X509Certificate[] certs, String authType) {
                }
            }
         };

          // Install the all-trusting trust manager
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());

            return sc;

        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return null;
    }

Soweit ich weiß sollte das eigentlich alle Zertifikate ohne Prüfung aktzeptieren.

Bei meinen http-Requests z.B. für den Login klappt das auch aber wenn ich den Context an SocketIO übergebe wird keine Verbindung mehr hergestellt... Hier mal mein Code:
Java:
 IO.Options options = new IO.Options();
        try {
            options.sslContext = CutsomSSLContext.createSSLContext();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
       options.secure = true;

       socket = IO.socket(Globals.HOST + "/?token=" + token);

            socket.on(socket.EVENT_CONNECT, new Emitter.Listener() {

                @Override
                public void call(Object... args) {
                    Log.d("SOCKETIO", "CONNECTED");
                    startMessageListener(socket);
                }

            });
Ich erhalte hier nie die ausgabe "CONNECTED", ohne https klappt es ohne Probleme....

Kann mir einer sagen was ich falsch mache ?

Grüße

arpi
 

arpi

Mitglied
oops, kleiner Fehler:

Beim Code oben Fehlt der zweite Parameter:
Java:
IO.socket(Globals.HOST + "/?token=" + token, options);
 

dzim

Top Contributor
Ich hab leider in den letzten Tagen nicht so viel Zeit, mir die interesanten Fragen anzukucken, aber eines muss ich bei SecureRandom los werden:
Some SecureRandom Thoughts | Android Developers Blog

Da ich mal was ähnliches gemacht habe, bin ich bei der Recherche über diesen Blog der Android Devs selbst gestolpert, der offenbar Probleme mit den normalen SecureRandom-gen (Linux? Java?) behandelt. Vielleicht also solltest du diesen Code in deine App einbinden und aufrufen, nur damit du keine potentiellen anderen Probleme bekommst.
Man weiss ja vor lauter Hartbleat, Bash-Zeug und Poodle gar nicht mehr, wohin man alles schauen soll...
 

arpi

Mitglied
okey, interessanter Artikel.

Wenn ich das jetzt richtig verstanden habe muss ich das einfach nur vor "createSSLContext()" "PRNGFixes.apply();" aufrufen ?

Wenn ja klappt es leider trotzdem nicht =(

Ich hab mir das Repository auf github mal genauer angeschaut und hab folgendes gefunden:

https://github.com/nkzawa/socket.io-client.java/issues/26

Anscheinend hat oder hatte einer das gleiche Problem nur leider wurde nicht mehr weiter darauf geantwortet.

Ich habe da noch nicht ganz verstanden wo bzw wie genau ich das LogLevel auf "Fine" stelle ? Bei LogCat lasse ich mir bereits alles anzeigen...

Den Code habe ich auch mal ergänzt und einen listener für die Events "EVENT_CONNECT_ERROR" und "EVENT_ERROR" implementiert. Bei EVENT_CONNECT_ERROR bekomme ich die Meldung:

"com.github.nkzawa.engineio.client.EngineIOException: xhr poll error"

Grüße

arpi
 
Zuletzt bearbeitet:

arpi

Mitglied
das wäre natürlich sehr nett =)

Wenn du willst kann ich dir auch einen Link mit dem Code zum Downloaden schicken so musst du nicht alles selber aufsetzen?
 

dzim

Top Contributor
Also mach dir erst mal keinen Kopf wegen dem Log-Level.
Ich habe bei mir den PRNGFixes#apply()-Aufruf gemacht bevor ich den Trustmanager und SSLContext gebaut hab. Der Unterschied ist, das PRNGFixes den neuen SecureRandom-Generator an Position 1 einfügt, da fügst du aber nach dem Fix auch den BouncyCastleProvider (der war für PGP, oder?).
Hast du mal eine andere Implementierung von SocketIO für Java ausprobiert? (Obwohl die meisten anderen auf GitHub eher nicht so aktiv zu sein scheinen.)
Das Problem ist, das ich mit SocketI noch nie was zu tun hatte, es könnte also auch schlicht ein Bug im Java-Code der Library sein...
 

arpi

Mitglied
das kann natürlich auch sein, ich würde das auch gerne richtig debuggen, aber ich bin leider Android / Java anfänger und ich würde ewig brauche bis ich das mal richtig verstanden habe....

Ich hatte mal eine andere Library ausprobiert ( weiß nicht mehr genau welche es war ) aber soweit ich gesehen habe funktionieren alle nicht mit der neuesten Version von socketio ( meistens nur < 1.0 ), da die meisten repositories auch nicht mehr wirklich gewartet werden. Anscheinend hat sich ab der Version 1.0 der Hearbeat (glaube ich?) geändert und deswegen sind die alte libraries nicht mehr kompatibel

Das repository von nkzawa ist das aktivste was ich bis jetzt gefunden habe, da war jetzt der Letzte commit vor 29 Tagen...

Heißt es wäre eigentlich am besten sich mal bei github anzumelden und mal ein bugreport zu öffnen ?

Einen Bug mit einem eigenem Zertifikat gibt es es ja sogar schon:
https://github.com/nkzawa/socket.io-client.java/issues/26

Da aber keine Antwort mehr vom Author gekommen ist geh ich mal fast davon aus das es dann doch geklappt hat ^^

Vielen Dank für die Unterstürzung

Grüße

arpi
 

dzim

Top Contributor
Ich denke, ein GitHub-Account schadet generell nicht :)

Ich kann dir erst einmal nur weiter Erfolg wünschen, denn wirklich hilfreich bin ich - glaube ich zumindest - hier bei konreten Implementierungsfrage zu SocketIO eh nicht...
 

arpi

Mitglied
@dzmi:

Könntest du mir evtl doch sagen wie ich die Logger ausgaben der Library sehe ?

Ich hab mir den Code doch mal ein bisschen genauer angeschaut und ich sehe überall ausgaben:

Java:
logger.fine(String.format("emitting packet with ack id %d", Socket.this.ids));

Ich verstehe nur nicht ganz wo bzw wie genau ich diese Ausgaben sehe....

Grüße

arpi
 
Zuletzt bearbeitet:

dzim

Top Contributor
Das hängt sicher davon ab, wie der Logger (lt. Code java.util.logging.Logger) konfiguriert wurde. Auf Android sollte es normalerweise über android.Log geregelt werden, aber ich denke dazu müsstest du es erst irgendwie konfigurieren. Ich vermute ganz stark: Ohne Konfig gehen die logs einfach verloren.
Ich verwende unter Android eigentlich immer nur android.Log, daher bin ich etwas raus aus der Übung. Und java.util.logging.Logger habe ich das letzte Mal vor X-Jahren verwendet (wenn dann eigentlich immer log4j)...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Android .pfx Zertifikat Android & Cross-Platform Mobile Apps 6

Ähnliche Java Themen

Neue Themen


Oben