39 votes

SSL personnalisé manipulation ne fonctionne plus sur Android 2.2 FroYo

Pour mon application, Transdroid, je me connecte à des serveurs distants via HTTP et éventuellement de manière sécurisée via HTTPS. Pour ces connexions en HTTPS avec le HttpClient je suis en utilisant un custom socket SSL usine de mise en œuvre pour s'assurer des certificats auto-signés sont de travail. En gros, j'accepte tout et d'ignorer tout de la vérification des certificats.

Cela a très bien marché pendant un certain temps maintenant, mais il n'a plus de travail pour Android 2.2 FroYo. Lorsque vous essayez de vous connecter, il sera de retour une exception:

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

Voici comment j'initialise le 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);

Je peux utiliser un FakeSocketFactory et FakeTrustManager, dont la source peut être trouvé ici: http://code.google.com/p/transdroid/source/browse/#svn/trunk/src/org/transdroid/util

Encore une fois, je ne comprends pas pourquoi il a soudainement cessé de travailler, ou même ce que l'erreur "Broken pipe" signifie. J'ai vu des messages sur Twitter, Seesmic et Twidroid échouer avec SSL activé sur FroYo, mais suis pas sûr si c'est lié.

Merci pour toute les directions/help!

43voto

Eric Kok Points 1097

Voici la réponse, avec beaucoup, beaucoup, grâce à un utile Seesmic développeur désireux de partager le correctif:

Dans le socket personnalisé usine, la création de la socket (avec createSocket) a apparemment été modifié spécifiquement pour l' SSLSocketFactory mise en œuvre. Alors le vieux:

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

Doit être modifié pour:

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

Et puis il a de nouveau fonctionné pour moi! Un diff est disponible ici (mais la solution est donc simple, je suppose que ce n'est pas vraiment nécessaire).

1voto

Jinu Points 11

Plus d'Info sur ce problème http://code.google.com/p/android/issues/detail?id=10472 Cela a réglé le problème SSL nous avons eu pour HTC Desire lorsque nous avons mis à jour vers Android 2.2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X