2012-11-28 21 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