5

问题摘要:相同的客户端-服务器配置、相同的网络拓扑、相同的设备(粗体 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 有关吗?

4

2 回答 2

2

我没有使用过 tls 连接,但是对于普通套接字,您可以通过附加程序在连接 URL 中以毫秒为单位指定显式超时:“;ConnectionTimeout=60000”

此外,您可能需要在套接字上添加某种 ping 机制,否则中间路由器可能最终会关闭连接,即使使用 keep-alive。

于 2012-07-06T00:15:27.503 回答
1

在 RIM 的帮助下,我终于弄明白了(您可以在此处找到相关票证)。所有功劳归于 RIM。

在 OS 7.1 中,创建 TLS/SSL 连接时的新安全措施。这是 RIM 文章的引述。

最近发现了一种新攻击,当使用 CBC 链接模式时,攻击者可以使用窃听和选择明文攻击的组合来解密 TLS 1.0 和 SSL 3.0 流量。

为了解决这个问题,我们实施了一项符合 SSL 规范的更改,并被大多数浏览器(例如 Mozilla® Firefox® 和 Google Chrome™)广泛采用。我们实施了一项对策,将 TLS 记录拆分为两条记录:第一条记录包含单个字节的数据,第二条记录包含其余数据,从而阻止攻击者利用此漏洞。

完整的文章可以在这里访问。

长话短说,为了减少与我的服务器的不兼容问题,我必须在打开连接之前将“ DisableCbcSecurity=true ”属性添加到连接字符串。

请注意,此解决方法适用于运行版本7.1.0.288及更高版本的设备,尽管我也可以在运行 7.1.0.267 的 Torch 9860 上正常工作。

于 2012-12-13T10:06:01.583 回答