2012-11-28 22 views
11

我在尝试连接到使用SSL的Web服务。我正在用C++与QNX IDE Momentics一起使用Blackberry 10。我想要做的连接如下:BB10中的SSL握手失败QNX Momentics IDE

URL: “https://开头movilapi ......”

代码:

networkAccessManager = new QNetworkAccessManager(this); 
    bool res = connect(networkAccessManager, SIGNAL(finished(QNetworkReply*)), 
      this, SLOT(requestFinished(QNetworkReply*))); 

    Q_ASSERT(res); 
    Q_UNUSED(res); 

    QNetworkRequest request = QNetworkRequest(QUrl(url)); 
    request.setRawHeader("User-Agent", "bb-phone/20120910"); 
    request.setRawHeader("Content-Type", "application/json"); 
    request.setRawHeader("Content-Length", postDataSize); 

    QSslConfiguration sslConfig = request.sslConfiguration(); 
    sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone); 
    sslConfig.setProtocol(QSsl::TlsV1); 
    request.setSslConfiguration(sslConfig); 

     networkAccessManager->post(request, outData); 

我总是得到同样的错误,无论我试图达到哪种服务。响应为: SSL握手失败

Wireshark的信息:

Protocol Length Info 
SSLv2 157 Client Hello 
TLSv1 1202 Server Hello, Certificate, Server Hello Done 
TLSv1 449 Client Key Exchange 
TLSv1 60  Change Cipher Spec 
TLSv1 91  Encrypted Handshake Message 
TLSv1 97  Change Cipher Spec, Encrypted Handshake Message 
TLSv1 605 Application Data 
TLSv1 280 Application Data 
TLSv1 277 Application Data 
TLSv1 121 Application Data 
TLSv1 92  Application Data 
TLSv1 297 Application Data, Application Data, Application Data, Application Data 
TLSv1 77  Encrypted Alert 

加密警报内容类型为21

的服务器密码套件是在客户端支持的密码列表中。

我用下面的LIB进行连接:QtNetwork/qnetworkreply.h

我希望这个新的信息提高问题的质量。

请帮忙,我一直在寻找几个小时没有成功。

+0

过期的证书的任何机会呢? –

+0

证书未过期。谢谢@RodrigoHahn – mariomunera

回答

2

在与这个特定问题的个人RIM取得联系之后,我们发现TLS/SSL服务器不允许某些扩展,所以通过以下Qt代码禁用扩展的传输,连接成功地通过https :

QSslConfiguration cfg(request.sslConfiguration()); 
cfg.setSslOption(QSsl::SslOptionDisableSessionTickets, true); 
request.setSslConfiguration(cfg); 

我想要学的研究应用开发部运动的关注和投入在这个问题上,直到我们终于得到了正确的方式去努力的特别关注。

下面是情况下,整个连接代码,任何人都面临着这样的需求:

networkAccessManager = new QNetworkAccessManager(this); 
bool res = connect(networkAccessManager, SIGNAL(finished(QNetworkReply*)), 
      this, SLOT(requestFinished(QNetworkReply*)));  
QNetworkRequest request = QNetworkRequest(QUrl(url)); 
request.setRawHeader("User-Agent", "BB_PHONE/20120926"); 
request.setRawHeader("Content-Type", "application/json"); 
request.setRawHeader("Content-Length", postDataSize); 

QSslConfiguration sslConfig = request.sslConfiguration(); 
sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone); 
sslConfig.setPeerVerifyDepth(1); 
sslConfig.setProtocol(QSsl::TlsV1); 
sslConfig.setSslOption(QSsl::SslOptionDisableSessionTickets, true); 

request.setSslConfiguration(sslConfig); 
networkAccessManager->post(request, outData); 
+0

这是非常有用的代码,但我有一个问题。对我来说,模拟器和真实设备的速度都很慢。 你有什么想法吗? – LILkillaBEE

0

您的服务器是否支持TLS v.1?也许它仅配置为SSLv2-3或TLS v1.1-1.2 另一种可能的方式是客户端和服务器密码套件不共享。运行Wireshark,它会显示握手包交换。在那里你可以看到支持的密码套件,SSL/TLS版本和一些其他信息。

+0

嗨。我只需检查Wireshark,并且服务器密码套件位于客户端密码套件支持列表中。我仍然无法连接或找出问题所在。由于wireshark,我也知道连接最终是一个加密警报类型21.我要编辑问题以添加wireshark信息。 – mariomunera