Estoy desarrollando una aplicación para Android que usa SSLSocket para conectarse a un servidor. Este es el código que estoy usando:La conexión TLS usando SSLSocket es lenta en Android OS
// 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.");
}
El problema es que se tarda unos 5 segundos o evento más que ver el apretón de manos TLS en la línea de abajo:
SSLSession session = socket.getSession();
he hecho un similares aplicación de iPhone, el apretón de manos lleva solo 1 segundo allí, así que creo que el problema no está en el servidor al que me estoy conectando, tal vez en el código anterior. La conexión en sí es lo suficientemente rápida, solo el saludo de TLS es lento.
¿Alguien sabe si es normal en Android, o si no lo es, cómo hacerlo más rápido?
Gracias.
Editado el 21.01.11:
he descubierto, que el apretón de manos es rápido cuando me conecto a otro servidor, por ejemplo paypal.com:443.
Pero me había estado conectando a otro servidor antes - un servicio .NET escrito por mí. Como había dicho antes, no pensé que el problema estaba en ese servidor porque si me conecto a él con mi aplicación de iPhone, el apretón de manos es rápido. Ahora no sé por qué es rápido en iPhone y lento en Android. Una vez establecida la conexión, lo único que hago en el servidor .NET es:
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.");
Sí Sé que TLS es generalmente más lento que una conexión pura, pero es lo suficientemente rápido. Sin embargo, el apretón de manos TLS es muy lento, toma 10 segundos, no 5 como dije antes. – Arthur