web-dev-qa-db-fra.com

La gestion SSL personnalisée a cessé de fonctionner sur Android 2.2 FroYo

Pour mon application, Transdroid, je me connecte à des serveurs distants via HTTP et éventuellement en toute sécurité via HTTPS. Pour ces connexions HTTPS avec le HttpClient, j'utilise une implémentation d'usine de socket SSL personnalisée pour m'assurer que les certificats auto-signés fonctionnent. Fondamentalement, j'accepte tout et j'ignore chaque vérification d'un certificat.

Cela fonctionne bien depuis un certain temps maintenant, mais cela ne fonctionne plus pour Android 2.2 FroYo. Lorsque vous essayez de vous connecter, il retournera 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);

J'utilise un FakeSocketFactory et FakeTrustManager, dont la source peut être trouvée ici .

Encore une fois, je ne comprends pas pourquoi il a soudainement cessé de fonctionner, ni même ce que signifie l'erreur "Pipe cassée". J'ai vu des messages sur Twitter que Seesmic et Twidroid échouent également avec SSL activé sur FroYo, mais je ne sais pas si c'est lié.

Merci pour toutes directions/aide!

38
Eric Kok

Voici la réponse, avec beaucoup, merci à un développeur Seesmic utile prêt à partager le correctif:

Dans la fabrique de socket personnalisée, la création de socket (avec createSocket) a apparemment été modifiée spécifiquement pour l'implémentation SSLSocketFactory. Alors l'ancien:

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

Doit être changé en:

    @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 ça a encore marché pour moi!

MISE À JOUR: Comme il s'agit toujours d'une réponse populaire, permettez-moi de mettre à jour mon lien vers le code de travail. Cette usine de socket compatible SSl qui prend en charge les protocoles modernes (TLS 1.1+), SNI et permet éventuellement de accepter tous les certificats (non sécurisé, ignore tous les certificats SSL) ou a - certificats auto-signés (par SHA-1 hash).

42
Eric Kok

Plus d'informations sur ce problème http://code.google.com/p/Android/issues/detail?id=10472 Cela a résolu le problème SSL que nous avions pour HTC Desire lors de la mise à jour vers Android 2.2

1
Jinu