2010-05-24 13 views
38

Dla mojej aplikacji, Transdroid, łączę się ze zdalnymi serwerami za pośrednictwem protokołu HTTP i opcjonalnie bezpiecznie przez HTTPS. W przypadku tych połączeń HTTPS z HttpClient używam niestandardowej implementacji gniazda SSL, aby upewnić się, że certyfikaty z podpisem własnym działają. Zasadniczo akceptuję wszystko i ignoruję każde sprawdzanie jakiegokolwiek certyfikatu.Niestandardowa obsługa SSL przestała działać w systemie Android 2.2 FroYo

To działa już od jakiegoś czasu, ale nie działa już na Androida 2.2 FroYo. Kiedy próbuje się połączyć, zwróci wyjątek:

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

Oto jak zainicjować httpclient:

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); 

mogę skorzystać z FakeSocketFactory i FakeTrustManager, których źródłem może być znaleziony here .

Ponownie, nie rozumiem, dlaczego nagle przestało działać, a nawet, co oznacza błąd "Broken pipe". Widziałem wiadomości na Twitterze, że Seesmic i Twidroid zawodzą z włączonym SSL w FroYo, ale nie jestem pewien, czy jest to powiązane.

Dzięki za wszelkie wskazówki/pomoc!

Odpowiedz

40

Oto odpowiedź, z wielu, wielu dzięki pomocnym Seesmic deweloper gotów dzielić poprawkę:

w fabryce gniazda zwyczaj, tworzenie gniazd (z createSocket) najwyraźniej zmienił specjalnie dla SSLSocketFactory realizacja. Tak stary:

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

musi być zmienione na:

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

A potem znów pracował dla mnie!

AKTUALIZACJA: Ponieważ jest to nadal popularna odpowiedź, pozwolę sobie zaktualizować mój link do działającego kodu. This SSl-enabled socket factory, które obsługują nowoczesne protokoły (TLS 1.1+), SNI i opcjonalnie pozwalają na accept all certificates (niezabezpieczone, ignoruje wszystkie certyfikaty SSL) lub self-signed certificates (według skrótu SHA-1).

+0

miałem ten sam problem. Dziękuję bardzo za to szybkie i łatwe rozwiązanie. –

+0

Ta poprawka sama dla mnie nie rozwiązała problemu - stwierdziłem, że muszę zwiększyć priorytet wątku, w którym ustanowiono połączenie z gniazdem do THREAD_PRIORITY_URGENT_AUDIO (a następnie ustawić priorytet z powrotem na THREAD_PRIORITY_MORE_FAVORABLE po nawiązaniu połączenia ustanowiony). W tym konkretnym przypadku podejrzewam, że animacja zużywała zbyt dużo procesora :-( – tonys

+0

jak to zrobić? Tony? – Mikey

1

Więcej informacji na temat tego problemu http://code.google.com/p/android/issues/detail?id=10472 ta stała się kwestią SSL mieliśmy do HTC Desire, gdy zaktualizowany do Androida 2.2

+0

W szczególności spójrz na komentarz nr 17: http://code.google.com/p/android/issues/detail?id=10807#c17. To bardzo mi pomogło podczas pobierania aplikacji na Androida gotowy. – Andrew