2010-05-24 11 views
38

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 de fabrique de socket SSL personnalisée pour m'assurer que les certificats auto-signés fonctionnent. Fondamentalement, j'accepte tout et ignore chaque vérification de n'importe quel certificat.La gestion SSL personnalisée a cessé de fonctionner sur Android 2.2 FroYo

Cela a fonctionné très bien depuis un certain temps maintenant, mais il ne fonctionne plus pour Android 2.2 FroYo. Lorsque vous essayez de vous connecter, il renvoie une exception:

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

Voici comment j'initialiser 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 utiliser un FakeSocketFactory et FakeTrustManager, dont la source se trouve here . Encore une fois, je ne comprends pas pourquoi il a soudainement cessé de fonctionner, ou même ce que l'erreur «Broken pipe» signifie. J'ai vu des messages sur Twitter que Seesmic et Twidroid échouent avec SSL activé sur FroYo, mais je ne sais pas si c'est lié.

Merci pour toute direction/aide!

Répondre

40

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

Dans l'usine de prise sur mesure, la création de socket (avec createSocket) a apparemment été modifié spécifiquement pour le SSLSocketFactory la mise en oeuvre. Ainsi, l'ancien:

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

doit être changé 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 cela a fonctionné à nouveau pour moi!

MISE À JOUR: Comme c'est toujours une réponse populaire, laissez-moi mettre à jour mon lien vers le code de travail. This SSl-enabled socket factory qui prend en charge les protocoles modernes (TLS 1.1+), SNI et permet en option de accept all certificates (non sécurisé, ignore tous les certificats SSL) ou un self-signed certificates (par hachage SHA-1).

+0

je le même problème. Merci beaucoup pour cette solution rapide et facile. –

+0

Ce correctif ne m'a pas résolu le problème en lui-même - j'ai dû augmenter la priorité du thread dans lequel la connexion de socket était établie à THREAD_PRIORITY_URGENT_AUDIO (suivi de la redéfinition de la priorité sur THREAD_PRIORITY_MORE_FAVORABLE une fois la connexion établie établi). Dans ce cas précis, je suspecte une animation utilise trop de CPU :-( – tonys

+0

comment faites-vous tony? – Mikey

1

Plus d'info sur ce problème http://code.google.com/p/android/issues/detail?id=10472 Ce résolu le problème SSL que nous avions pour HTC Desire quand nous mis à jour vers Android 2.2

+0

Plus précisément, regardez le commentaire # 17: http://code.google.com/p/android/issues/detail?id=10807#c17 Cela m'a beaucoup aidé tout en obtenant une application Android prêt. – Andrew