10
votes

La connexion TLS à l'aide de SSLSocket est lente dans le système d'exploitation Android

Je développe une application Android qui utilise SSLSocket pour vous connecter à un serveur. Ceci est le code que j'utilise:

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


0 commentaires

4 Réponses :


0
votes

J'ai fait quelque chose de similaire à celui-ci et il est plus lent qu'une connexion non garantie. Accordé mon cas était https vs http et il est un peu différent du facteur SSL / TLS ajoutera la lenteur à la transaction.

J'ai deux applications identiques qui communiquent avec le même protocole sur le même serveur, un dans Android et un sur iPhone, à la fois à l'aide de HTTPS. Quand je les ai testé les deux dans http, je verrais plus ou moins le même temps de réponse, dans HTTPS IOS était légèrement plus rapide dans mon cas, mais pas terriblement.


1 commentaires

Oui, je sais que TLS est généralement plus lent qu'une connexion pure, mais c'est assez rapide. La poignée de main TLS est cependant très lente, il faut 10 secondes, pas 5 comme je l'avais déjà dit auparavant.



2
votes

Vous utilisez un nouveau SECURUERANDOM par connexion, au lieu d'utiliser un seul code statique pré-initialisé SECURANDANDOM . Chaque fois que vous créez un nouveau SECURUDANDOM (), vous devez rassembler l'entropie pour ensemencement (un processus lent).

Sécuriendom n'est pas auto-graine tant qu'elle n'est pas utilisée pour la première fois, c'est pourquoi le délai ne se produit pas tant que l'appel sur greatession ()


4 commentaires

Merci pour votre réponse JumboGram, j'ai essayé ce que vous avez dit, j'utilise maintenant une seule instance de SE SE SE SE SE SIMERAINDOM, qui est initialisé dans le constructeur. Mais peu importe la fréquence où je me connecte et se déconnecte, il faut toujours environ 10 secondes pour exécuter socket.getsession ();


Si c'était moi, j'essaierais d'obtenir une capture de paquets et de regarder où se trouve le ralentissement. Est-ce 1 seconde entre chaque paquet? Existe-t-il un long délai entre le paquet (n) et (n + 1), mais tout le reste rapide? Des choses comme ça.


Bonne idée, je vais essayer. J'ai découvert que la poignée de main est rapide lorsque je me connecte à un autre serveur, par exemple PayPal.com:443. J'ai édité mon poste maintenant, je pense que je dois changer quelque chose dans le serveur .NET, mais je ne sais pas quoi, peut-être que le problème est dans le certificat du serveur, aucune idée ..


Merci que cela a réellement coupé notre temps de demande à la moitié, mais je suppose que ce serait de ne pas être mal régénérant le aléatoire sécurisé après un temps aléatoire!



-1
votes

Le problème est probablement dans la manière dont l'appareil valide les certificats de serveur. La validation peut impliquer en contact avec les tiers pour les réponses CRLS et OCSP. Si cela se produit, cela prend du temps. iPhone ne fait probablement pas cela (au moins par défaut) qui est un trou de sécurité BTW.


0 commentaires