2010-05-24 6 views
38

Für meine App, Transdroid, verbinde ich mich über HTTP und optional sicher über HTTPS mit Remote-Servern. Für diese HTTPS-Verbindungen mit dem HttpClient verwende ich eine benutzerdefinierte SSL-Socket-Factory-Implementierung, um sicherzustellen, dass selbstsignierte Zertifikate funktionieren. Grundsätzlich akzeptiere ich alles und ignoriere jede Überprüfung eines Zertifikats.Benutzerdefinierte SSL-Behandlung funktioniert nicht mehr unter Android 2.2 FroYo

Dies funktioniert seit einiger Zeit gut, aber es funktioniert nicht mehr für Android 2.2 FroYo. Wenn die Verbindung versuchen, wird eine Ausnahme zurück:

java.io.IOException: SSL handshake failure: I/O error during system call, Broken pipe 

Hier ist, wie ich die Httpclient initialisieren:

SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", new PlainSocketFactory(), 80)); 
    registry.register(new Scheme("https", (trustAll ? new FakeSocketFactory() : SSLSocketFactory.getSocketFactory()), 443)); 
    client = new DefaultHttpClient(new ThreadSafeClientConnManager(httpParams, registry), httpParams); 

ich nutzen eine FakeSocketFactory und FakeTrustManager, von denen die Quelle here finden .

Wieder verstehe ich nicht, warum es plötzlich aufgehört hat zu arbeiten, oder sogar was der Fehler 'Gebrochenes Rohr' bedeutet. Ich habe Nachrichten auf Twitter gesehen, dass Seesmic und Twidroid bei aktiviertem SSL auf FroYo ebenfalls fehlschlagen, bin aber unsicher, ob es verwandt ist.

Danke für alle Richtungen/Hilfe! Hier

Antwort

40

ist die Antwort, mit vielen, vielen dank einer hilfreichen Seesmic Entwickler bereit, um das Update zu teilen:

In der benutzerdefinierten Socket-Factory, die Socket-Erstellung (mit createSocket) hat offenbar speziell für die SSLSocketFactory geändert Implementierung. So ist die alte:

@Override 
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) 
        throws IOException, UnknownHostException { 
      return getSSLContext().getSocketFactory().createSocket(); 
    } 

muss geändert werden:

@Override 
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) 
        throws IOException, UnknownHostException { 
      return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose); 
    } 

Und dann funktionierte es wieder für mich!

UPDATE: Da dies immer noch eine beliebte Antwort ist, lassen Sie mich meinen Link zu Arbeitscode aktualisieren. This SSl-enabled socket factory unterstützt moderne Protokolle (TLS 1.1+), SNI und erlaubt optional accept all certificates (unsicher, ignoriert alle SSL-Zertifikate) oder self-signed certificates (von SHA-1-Hash).

+0

ich das gleiche Problem. Vielen Dank für diese schnelle und einfache Lösung. –

+0

Dieses Update löste das Problem für mich selbst nicht - ich fand, dass ich auch die Priorität des Threads, in dem die Socket-Verbindung hergestellt wurde, zu THREAD_PRIORITY_URGENT_AUDIO erhöhen musste (gefolgt von der Zurücksetzung der Priorität auf THREAD_PRIORITY_MORE_FAVORORABLE nach der Verbindung) etabliert). In diesem speziellen Fall vermute ich, dass eine Animation zu viel CPU verwendet :-( – tonys

+0

wie tun Sie es tony? – Mikey

1

Weitere Informationen zu diesem Problem http://code.google.com/p/android/issues/detail?id=10472 Dieses reparierten das SSL Problem, das wir für HTC Desire hatten, als wir auf Android aktualisiert 2.2

+0

Genauer gesagt, schauen Sie sich Kommentar # 17: http://code.google.com/p/android/issues/detail?id=10807#c17.Dies hat mir sehr geholfen, während eine Android-App bereit. – Andrew