Résumé du problème: Même configuration client-serveur, même topologie réseau, même appareil (Bold 9900) - fonctionne parfaitement bien sur OS 7.0 mais ne fonctionne pas comme prévu sur OS 7.1 et la connexion sécurisée tls est fermée par le serveur après un très court laps de temps.
Question: Est-ce qu'il est censé y avoir une différence dans l'ouverture de la connexion tls sécurisée entre OS 7.0 et OS 7.1? Est-ce que RIM a changé quelque chose dans l'infrastructure tls en 7.1? Y a-t-il quelque chose qui pourrait provoquer une fermeture prématurée de la connexion tls sécurisée en 7.1?
Mon application ouvre une connexion tls sécurisée vers un serveur. La connexion est maintenue active par un mécanisme de keep-alive de la couche d'application et reste ouverte jusqu'à ce que le client la ferme. Ci-joint une version simplifiée du code réel qui ouvre la connexion et lit depuis le socket. Le code fonctionne parfaitement sur OS 5.0-7.0 mais ne fonctionne pas comme prévu sur OS 7.1.
Lorsqu'il est exécuté sur OS 7.1, le blocage de read()
retourne avec -1 (fin du flux a été atteinte) après un très court laps de temps (10-45 secondes). Pour OS 5.0-7.0, l'appel à read()
reste bloquant jusqu'à ce que les prochaines données arrivent et la connexion n'est jamais fermée par le serveur.
Connection connection = Connector.open(connectionString);
connInputStream = connection.openInputStream();
while (true) {
try {
retVal = connInputStream.read();
if (-1 == retVal) {
break; // fin du flux a été atteinte
}
} catch (Exception e ) {
// gestion des erreurs
}
// les données lues depuis le flux sont traitées ici
}
UPDATE 1:
Apparemment, le problème n'apparaît que lorsque j'utilise une connexion tls sécurisée (soit en utilisant le réseau mobile, soit le WiFi) sur OS 7.1. Tout fonctionne comme prévu lors de l'ouverture d'une connexion non sécurisée sur OS 7.1.
Pour tls sur les réseaux mobiles, j'utilise la chaîne de connexion suivante :
connectionString = "tls://someipaddress:443;deviceside=false;ConnectionType=mds-**secret**;EndToEndDesired";
Pour tls sur le Wifi, j'utilise la chaîne de connexion suivante :
connectionString = "tls://someipaddress:443;interface=wifi;EndToEndRequired"
UPDATE 2:
La connexion n'est jamais idle. Je reçois et envoie constamment des données dessus. Le problème apparaît aussi bien en utilisant la connexion mobile qu'en utilisant le WiFi. Le problème apparaît à la fois sur de vrais appareils OS 7.1 et sur les simulateurs. Je commence à soupçonner que cela est en quelque sorte lié soit à la chaîne de connexion soit à la poignée de main tls.
UPDATE 3:
Selon les captures de Wireshark que j'ai faites avec le simulateur OS 7.1, la connexion tls sécurisée est fermée par le serveur (le client reçoit FIN). Pour le moment, je n'ai pas la clé privée du serveur donc je ne peux pas déboguer la poignée de main tls, mais je suis plus sûr que jamais que la cause principale est la poignée de main tls.
UPDATE 4:
La chute de la connexion tls sécurisée se produit lorsque la suite de chiffrement RSA 2048 AES 256 est négociée uniquement sur OS 7.1. La même suite de chiffrement fonctionne parfaitement sur OS 7.0. En revanche, lors de l'utilisation de la suite de chiffrement DHE/DSS 768 AES 128, tout fonctionne comme prévu sur OS 7.1 et la connexion reste stable. Cela doit être en quelque sorte lié à la suite de chiffrement RSA 2048 AES 256. Des idées?