it-swarm.com.de

HTTPS GET (SSL) mit Android und selbstsigniertem Serverzertifikat

Ich habe in verschiedenen Beiträgen nachgeschlagen, wie etwas über HTTPS unter Android von einem Server abgerufen werden kann, der ein selbstsigniertes Zertifikat verwendet. Keiner von ihnen scheint jedoch zu funktionieren - sie alle können das System nicht entfernen 

javax.net.ssl.SSLException: Nicht vertrauenswürdige Serverzertifikatnachricht. 

Es ist keine Option zum Ändern des Servers, um ein vertrauenswürdiges Zertifikat zu erhalten, und es ist auch keine Option, um das Serverzertifikat mit der IP-Adresse des Servers abzustimmen.

Beachten Sie, dass der Server keinen DNS-Namen hat, sondern nur eine IP-Adresse. Die GET-Anfrage sieht ungefähr so ​​aus:

 https://username:[email protected]/blabla/index.php?param=1&param2=3

Ich bin mir bewusst, dass diese Lösung für Man-in-the-Middle-Angriffe usw. anfällig ist.

Daher muss die Lösung das mangelnde Vertrauen in das Zertifikat und den Hostnamenkonflikt ignorieren.

Kennt jemand den Code, der Java für Android verwendet?

Es gibt viele Versuche, dies auf stackoverflow.com zu erklären, und es gibt viele Codeausschnitte, aber sie scheinen nicht zu funktionieren, und niemand hat einen Codeblock bereitgestellt, der dies löst, soweit ich sehen kann . Es wäre interessant zu wissen, ob jemand dieses Problem wirklich gelöst hat oder ob Android Zertifikate blockiert, die nicht vertrauenswürdig sind.

32
Lars D

Ich habe eine App erstellt, die selbstsigniert ist oder allen Zertifikaten vertraut. Die Quelle ist hier: http://code.google.com/p/meneameandroid/source/browse/#svn/trunk/src/com/dcg/auth und kann kostenlos verwendet werden: P

Verwenden Sie einfach den HttpManager und erstellen Sie die SSL-Factory mit der Vertrauensstellung eins: http://code.google.com/p/meneameandroid/source/browse/trunk/src/com/dcg/util/HttpManager.Java

BEARBEITEN: Links aktualisiert

36
Moss

Wie Sie richtig hervorheben, gibt es zwei Probleme: a) Das Zertifikat ist nicht vertrauenswürdig und b) der Name auf dem Zertifikat stimmt nicht mit dem Hostnamen überein.

WARNUNG: Für alle anderen, die zu dieser Antwort gelangen, ist dies ein schmutziger, schrecklicher Hack und Sie dürfen nicht verwenden ihn für alles, was wichtig ist. SSL/TLS ohne Authentifizierung ist schlimmer als gar keine Verschlüsselung - das Lesen und Ändern Ihrer "verschlüsselten" Daten ist trivial für einen Angreifer und Sie würde nicht einmal wissen, dass es passiert ist .

Immer noch bei mir? Ich fürchtete mich so ...

a) wird gelöst, indem ein benutzerdefinierter SSLContext erstellt wird, dessen TrustManager Folgendes akzeptiert:

SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, new TrustManager[] {
  new X509TrustManager() {
    public void checkClientTrusted(X509Certificate[] chain, String authType) {}
    public void checkServerTrusted(X509Certificate[] chain, String authType) {}
    public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
  }
}, null);
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());

und b) indem ein HostnameVerifier erstellt wird, mit dem die Verbindung fortgesetzt werden kann, obwohl das Zertifikat nicht mit dem Hostnamen übereinstimmt:

HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
  public boolean verify(String hostname, SSLSession session) {
    return true;
  }
});

Beides muss direkt am Anfang Ihres Codes geschehen, bevor Sie anfangen, mit HttpsURLConnections herumzuspielen und so weiter. Dies funktioniert sowohl in Android als auch in der regulären JRE. Genießen.

35
SimonJ
6
Maciek Sawicki

Wenn Sie eine HttpsURLConnection verwenden, versuchen Sie, setHostnameVerifier vor connect() aufzurufen, und übergeben Sie eine HostnameVerifier, die unabhängig von der Richtigkeit nur akzeptiert wird.

6
Yuliy

Wenn Sie Zugriff auf die Geräte haben, können Sie das Zertifikat einem Keystore hinzufügen. Weitere Informationen finden Sie hier .

Auf der anderen Seite können Sie diese Methode verwenden, aber ich finde es irgendwie hässlich.


Ressourcen:

Zum gleichen Thema:

2
Colin Hebert

Wenn Sie mich fragen, machen Sie es auf sichere Weise. 

Ein gutes Tutorial gefunden http://blog.antoine.li/index.php/2010/10/Android-trusting-ssl-certificates/ und es ist wirklich nicht so schwer zu implementieren.

Auch das von Maciek empfohlene Tutorial ist sehr gut.

Ich habe es getestet und es funktioniert in meiner App ohne Probleme.

1
saxos

Ich habe eine App erstellt, die ein selbstsigniertes Zertifikat vor 4 Monaten verwendet. Hier ist der Code, den ich hoffe, dass er hilft: https://bitbucket.org/momo0002/tlsdemo.git

0
moji