Connexion TLS utilisant SSLSocket est lent dans le système d'exploitation Android

Je voudrais développer une application Android qui utilise SSLSocket pour se connecter à un serveur. C'est le code que j'utilise:

//Connect
if (socket == null || socket.isClosed() || !socket.isConnected()) {
    if (socket != null && !socket.isClosed())
        socket.close();
    Log.i(getClass().toString(), "Connecting...");
    if (sslContext == null) {
        sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustAllCerts, new SecureRandom()); 
    }
    SSLSocketFactory socketFactory = sslContext.getSocketFactory();
    socket = (SSLSocket)socketFactory.createSocket(host, port);
    socket.setSoTimeout(20000);
    socket.setUseClientMode(true);
    connected = true;
    Log.i(getClass().toString(), "Connected.");
}

//Secure
if (connected) {
    Log.i(getClass().toString(), "Securing...");
    SSLSession session = socket.getSession();
    secured = session.isValid();
    if (secured) {
        Log.i(getClass().toString(), "Secured.");
    }
    else
        Log.i(getClass().toString(), "Securing failed.");
}

Le problème est que cela prend environ 5 secondes ou plus pour faire la poignée de main TLS dans la ligne ci-dessous:

SSLSession session = socket.getSession();

J'ai fait une telle application iPhone, le temps est à seulement 1 seconde, donc je pense que le problème n'est pas dans le serveur, je suis connecté, c'est peut-être dans le code ci-dessus. La connexion en elle-même est assez rapide, juste la poignée de main TLS est lente.

Quelqu'un sait si c'est normal dans Android, ou si elle ne l'est pas, comment le rendre plus rapide?

Merci.

ÉDITÉ sur 21.01.11:

J'ai découvert, que la poignée de main est rapide lorsque je me connecte sur un autre serveur, par exemple paypal.com:443.

Mais j'avais été connecter à un autre serveur avant - un .NET service écrit par moi. Comme je l'avais dit avant, je ne pense pas que le problème était dans le serveur parce que si je m'y connecter avec mon iPhone App la poignée de main est rapide. Maintenant, je ne sais pas pourquoi il est rapide sur iPhone et lent sur Android. Une fois la connexion établie, la seule chose que je fais le .NET serveur est:

Console.WriteLine("New client connected.");
this.sslStream = new SslStream(tcpClient.GetStream(), true);
this.sslStream.ReadTimeout = 15000;
this.sslStream.WriteTimeout = 15000;

Console.WriteLine("Beginning TLS handshake...");
this.sslStream.AuthenticateAsServer(connection.ServerCertificate, false, SslProtocols.Tls, false);
Console.WriteLine("TLS handshake completed.");

OriginalL'auteur Arthur | 2011-01-19