问题摘要:相同的客户端-服务器配置、相同的网络拓扑、相同的设备(粗体 9900)- 在 OS 7.0上运行良好,但在 OS 7.1上无法正常运行,并且安全的tls连接在经过很长时间后被服务器关闭短时间。
问题:OS 7.0 和 OS 7.1 之间的安全 tls 连接打开是否应该有任何区别?RIM 在 7.1 中是否更改了 tls 基础设施中的任何内容?在 7.1 中是否有可能导致过早的安全 tls 连接关闭?
我的应用程序打开到服务器的安全 tls 连接。连接通过应用层保持活动机制保持活动状态,并保持打开状态,直到客户端关闭它。附件是打开连接并从套接字读取的实际代码的简化版本。该代码在 OS 5.0-7.0 上完美运行,但在 OS 7.1 上无法正常运行。
在 OS 7.1 上运行时,阻塞在很短的时间(10-45 秒)后read()
返回-1(已到达流的末尾)。对于 OS 5.0-7.0,调用会read()
一直阻塞,直到下一个数据到达并且服务器永远不会关闭连接。
Connection connection = Connector.open(connectionString);
connInputStream = connection.openInputStream();
while (true) {
try {
retVal = connInputStream.read();
if (-1 == retVal) {
break; // end of stream has been reached
}
} catch (Exception e ) {
// do error handling
}
// data read from stream is handled here
}
更新 1:
显然,仅当我在 OS 7.1 上使用安全tls连接(使用移动网络或 WiFi)时才会出现问题。在 OS 7.1 上打开非安全连接时,一切正常。
对于移动网络上的 tls,我使用以下连接字符串:
connectionString = "tls://someipaddress:443;deviceside=false;ConnectionType=mds-**secret**;EndToEndDesired";
对于 Wifi 上的 tls,我使用以下连接字符串:
connectionString = "tls://someipaddress:443;interface=wifi;EndToEndRequired"
更新 2:
连接永远不会空闲。我不断地在上面接收和发送数据。使用移动连接和 WiFi 时都会出现此问题。该问题出现在真正的 OS 7.1 设备和模拟器上。我开始怀疑它与连接字符串或 tls 握手有某种关系。
更新 3:
根据我使用 OS 7.1 模拟器进行的 Wireshark 捕获,服务器正在关闭安全的 tls 连接(客户端收到FIN)。目前我没有服务器的私钥,因此我无法调试 tls 握手,但我比以往任何时候都更加确定根本原因是 tls 握手。
更新 4:仅在 OS 7.1 上协商RSA 2048 AES 256
密码套件
时,会出现安全 tls 连接丢失。相同的密码套件在 OS 7.0 上运行良好。另一方面,当使用DHE/DSS 768 AES 128密码套件时,在 OS 7.1 上一切正常,并且连接保持稳定。它一定与RSA 2048 AES 256 cipher suite.ideas 有关吗?