黑莓OS 7.1安全TLS连接是很短的时间后关闭

问题描述:

问题摘要:同一个客户端 - 服务器的配置,相同的网络拓扑结构,相同的设备(粗体9900) - 完美的作品以及对OS 7.0但不工作如预期在操作系统7.1和安全tls连接正在由服务器关闭很短的时间后。黑莓OS 7.1安全TLS连接是很短的时间后关闭

问题:是否应该在OS 7.0和OS 7.1之间的安全连接打开方面有任何不同? RIM在7.1中修改了tls基础设施中的任何内容吗?在7.1中是否有可能导致过早的安全连接关闭?

我的应用程序打开一个安全的tls连接到服务器。该连接通过应用程序层保持活动机制保持活动状态,并保持打开状态,直到客户端关闭它。附件是打开连接并从套接字读取的实际代码的简化版本。该代码在OS 5.0-7.0上完美工作,但在OS 7.1上无法按预期工作。

当在OS 7.1上运行时,阻塞read()以非常短的时间(10-45秒)返回-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 
} 

UPDATE 1
显然,该问题当我使用上OS 7.1固定TLS连接(使用移动网络或WiFi)才会出现。在OS 7.1上打开一个非安全连接时,一切都按预期工作。

有关I使用下面的连接字符串移动网络TLS:

connectionString = "tls://someipaddress:443;deviceside=false;ConnectionType=mds-**secret**;EndToEndDesired"; 

有关无线上网的TLS我使用下面的连接字符串:

connectionString = "tls://someipaddress:443;interface=wifi;EndToEndRequired" 

UPDATE 2
连接永远不会空闲。我一直在接收和发送数据。使用移动连接和WiFi时都会出现此问题。这个问题出现在真实的OS 7.1设备和模拟器上。我开始怀疑它与连接字符串或tls握手有关。

UPDATE 3
据的Wireshark捕获我与OS 7.1模拟器,有担保TLS连接正被关闭服务器(客户端接收FIN)。目前我没有服务器的私钥,因此我无法调试tls握手,但我比以往更确定根本原因是握手。

UPDATE 4
有担保TLS连接时下降RSA 2048 AES 256密码套件仅OS 7.1协商出现。相同的密码套件在OS 7.0上完美运行。另一方面,当使用DHE/DSS 768 AES 128密码套件时,在OS 7.1上一切都按预期工作,并且连接保持稳定。它必须以某种方式与相关RSA 2048 AES 256 cipher suite.ideas?

+0

我不是专家,但可以专门为tls连接配置服务器吗? – 2012-07-05 21:42:52

+0

@EugenMartynov服务器配置正确。相同的服务器,运行OS5/6/7的相同客户端 - >一切正常(安全和非安全)。 – mrvincenzo 2012-07-06 04:07:39

+0

当它返回-1(流结束)时,它是否在一致的秒数之后这样做?你提到过“30-45”。如果你确切地说是时间的话,这暗示它正在发生某种超时。我使用的一个技巧是配置一个'奇怪'的超时,比如35秒,以帮助诊断它来自哪里。你有没有尝试过使用https连接字符串? – seand 2012-07-06 06:01:39

我终于弄清楚了RIM的帮助(你可以找到相关的票here)。所有的功劳归功于RIM。

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

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

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

整篇文章可以访问here。为了减少与我的服务器的不兼容问题,我必须在打开连接之前将“DisableCbcSecurity = true”属性添加到连接字符串中。

注意,这解决办法将运行版本7.1.0.288和较高的,虽然我也因此在正常火炬9860工作运行7.1.0.267的设备。

我还没有和TLS连接的工作,但对于普通插座,您可以指定在连接URL毫秒明确的超时,通过一个appender:“ConnectionTimeout = 60000”

此外,您可能会需要在套接字上添加某种ping机制,否则中间路由器最终可能会关闭连接,即使保持活动状态。

+0

检查它 - 相同的结果。我已经在网络上的几个地方看到了'ConnectionTimeout'参数,但''Connector'类API文档中没有提及它。它是否适用于非非tls连接? – mrvincenzo 2012-07-06 05:52:18

+0

@MrVincenzo网址参数记录非常糟糕,您会在BB论坛帖子和开源代码中发现很多不出现在任何官方文档中的任何地方,所以不要让您失望。无论你能找到什么,试验和错误都可能是必要的。 – roryf 2012-07-12 21:58:20