HTTPS Verbindung zu einem Server mit selbst erstelltem Sicherheitszertifikat

  • Antworten:7
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 10

23.02.2015, 17:48:56 via Website

Hallo Community,

seit Tagen verzweifle ich daran, mich mit meiner App über eine verschlüsselte Verbindung mit meinem Server zu vebinden. Vorher habe ich die Verbindung über http laufen lassen und konnte mit JSON meine benötigten Daten abfragen und verschicken.
Da ich mich in dem Gebiet der Verschlüsselung nicht gut auskenne, würde mich über eine Einführung in die Vorraussetzungen und der Vorgehensweise einer HTTPS Verbindung freuen.

Bisher konnte ich meinen Server "HTTPS-fähig" gemacht, sodass ich über den Browser auf meinen Server (mit der Bestätigung dass ich diesem Zertifikat vertraue..) gelange.
Also ist der Server doch nun soweit seinen Public Key an die aufrufende Instanz zu verschicken , und damit einen Handshake herzustellen, oder?

Nun stellt sich mir die Frage ob das reicht? Oder brauche ich auf client seite jetzt auch nochmal ein Zertifikat?
Und Wenn ja wie sieht das ganze mit dem Implementierung aus? Was braucht die App alles für die Verbindung?

Fragen über Fragen...:D

Ich hoffe mir kann jemand weiterhelfen, wäre echt super!

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

23.02.2015, 18:15:35 via Website

Wenn du ein Zertifikat akzeptieren musst, ist die Verbindung schon verschlüsselt.
Das heißt normalerweise brauchst du kein Client Zertifikat.(!) Es sei denn nur bestimmte User dürfen diese SSL Verbindung nutzen (was bei einer App wenig sinn macht).

Was braucht die App alles für die Verbindung?

So wie vorher auch, kannst du deinen HTTPClient nutzen, dieser muss halt für SSL ausgelegt sein und eventuell dein unsicheres Zertifikat durchgehen lassen (da du es ja selber erstellt hast).
Generell ich das möglich, ich nutze das für meine App auch und es funktioniert mit Verschlüsseltem Traffic.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 10

23.02.2015, 18:40:59 via Website

Also erstmal danke für die schnelle Antwort!

Ok, das hört sich doch schonmal gut an.
Heißt das, dass bei einem Handshake in der Regel nur ein PublicKey verwendet wird um beide Seiten miteinander kommunizieren zu lassen?
Und vor allem, wie sage ich meinem vorher verwendeten DefaultHttpClient:

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();

        InputStream is = httpEntity.getContent();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 9);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();

, dass er meinem Server-Zertifikat vertraut?

Hört sich ja so an, als wenn es das Ziel nicht mehr so weit entfernt ist?!:D

Antworten
  • Forum-Beiträge: 10

26.02.2015, 02:15:11 via Website

Danke, es scheint endlich geklappt zu haben!!!

Ich konnte mit dem oben aufgeführten Link (einen Post weiter) die HTTPS - Verbindung implementieren.

Dennoch bleiben zwei Fragen offen:
-Ist es denn wirklich ratsam das server zertifikat (zertifikatname.crt) in den /raw Unterordner von res zu legen? Was genau enthält dieses Serverzertifikat für Informationen und dürfen diese alle lesen?
-Was spricht für eine HttpClient Verbindung und eine HttpsUrlConnection und was dagegen?

Antworten
  • Forum-Beiträge: 2.243

26.02.2015, 10:16:45 via Website

Oualid Lkhaouni

Danke, es scheint endlich geklappt zu haben!!!

Ich konnte mit dem oben aufgeführten Link (einen Post weiter) die HTTPS - Verbindung implementieren.

Dennoch bleiben zwei Fragen offen:
-Ist es denn wirklich ratsam das server zertifikat (zertifikatname.crt) in den /raw Unterordner von res zu legen? Was genau enthält dieses Serverzertifikat für Informationen und dürfen diese alle lesen?
-Was spricht für eine HttpClient Verbindung und eine HttpsUrlConnection und was dagegen?

1)
Für eine HTTPS Verbindung benötigt der Client kein Zertifikat, also liefer bloß Dein Zertifikat nicht mit der App aus und damit für jedermann einfach auslesbar.
Generell würde ich mich bei sicherheitsrelevanten Aspekten in der Programmierung immer sehr genau mit dem Thema beschäftigen, bevor ich es öffentlich zum Download anbiete. Wenn eine Verwundbarkeit erstmal "in the wild" ist, gilt die gesamte Kette als kompromittiert und muss ausgewechselt werden.
Genau so wie wenn Du einen Generalschlüssel, oder Deine EC Karte verlierst. Sobald sie in fremder Hand ist, weißt Du nicht was damit passieren wird, also sperrt/tauscht man in der Regel das ganze System und ich denke nicht, dass Du das bei einer App riskieren willst :)

2)
Es gibt in beiden Fällen Vor- und Nachteile. Zum Beispiel habe ich mich mal in dem Zusammenhang mit der Hostname Verification beschäftigt, weil HttpClient da an einigen Stellen zu lax ist. Bedeutet: Man kann durch eine Man-In-The-Middle Attacke HTTPS Verbindungen umleiten, ohne, dass er automatisch sicherstellt, dass das Zertifikat was er vom Server bekommt für die URL ausgestellt wurde, die er grade liest.
Wenn also jemand Deine App durch Routing-Manipulation dazu bringt, dass sie sich mit seinem Server verbindet, wird sie fröhlich Ihre Daten an den Angreifer schicken und er kann Anmeldedaten abfangen, oder das Protokoll reverse-engineeren und nachbauen.
Soweit ich weiß gibt es solche Probleme aber auch wenn man die SSLSocketFactory direkt nutzt und damit evtl. auch bei HttpsUrlConnection.
Musst mal googlen.

Antworten
  • Forum-Beiträge: 10

26.02.2015, 11:17:54 via Website

Zu 1)
Ok, das klingt einleuchtend. Wobei der weiter oben aufgeführte Link mir doch genau das sagt, oder?

("If you have a custom/self-signed certificate on server that is not there on device, you can use the below class to load it and use it on client side in. Place the certificate .crt file in /res/raw so that it is available from R.raw.
Use below class to obtain an HTTPClient or HttpsURLConnection which will have a socket factory using that certificate :")

Wenn ich es also nicht machen sollte, da sonst jeder client das zertifikat vom server (zertifikat.crt) hat, wie soll die Android App das selbst erstellte Server-Zertifikat bei jeder Verbindung bestätigen?

Zu 2)
Auf den ersten Blick hört sich das an, als ob eine httpsurlconnection "sicherer" wäre, wobei man MITM-Attacken anscheinend doch bei beiden einsetzen kann?!:S :D

Antworten
  • Forum-Beiträge: 10

01.03.2015, 00:02:07 via Website

Also folgendes habe ich mit dieser Frage bei (HTTP) stackoverflow.com/questions/28776268/client-server-https-communication-servercertificats/28787535#28787535" erreichen können:

"As long as you put only public part of the certificate (.crt), everything is fine. Do not put private key on client app and you will be safe."

Heißt das also doch, dass in der server.crt datei keine privaten Infos sind, wie z.b. der private key?
Somit steht das aber im Widerspruch zu dem von Rafael K.?!

Wäre super wenn mir jemand helfen könnte?

Antworten

Empfohlene Artikel