BB10 QNX Momentics IDE中的SSL握手失败

时间:2012-11-28 20:27:15

标签: c++ ssl blackberry-10 sslhandshakeexception blackberry-qnx

我正在尝试连接到使用SSL的Web服务。我正在使用QNX IDE Momentics在C ++中使用Blackberry 10。我正在尝试的连接如下:

网址:“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

我希望这些新信息可以提高质量。

请帮助,我一直在寻找数小时但没有成功。

2 个答案:

答案 0 :(得分:2)

在与一些RIM个人就此特定问题取得联系后,我们发现TLS / SSL服务器不能容忍某些扩展,因此使用以下Qt代码禁用扩展传输,通过https成功建立连接:

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

我想特别提及Research In Motion的应用程序开发部门,以便在我们最终找到正确的方法之前注意和投入这个问题。

以下是任何人都面临这种需求的整个连接代码:

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);

答案 1 :(得分:0)

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