BB10 QNX Momentics IDE中的SSL握手失败

mar*_*era 11 c++ ssl sslhandshakeexception blackberry-10 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);
Run Code Online (Sandbox Code Playgroud)

无论我试图达到哪种服务,我总是得到同样的错误.响应是: 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
Run Code Online (Sandbox Code Playgroud)

加密警报内容类型为21

服务器密码套件位于客户端支持的密码套件列表中.

我正在使用以下lib来建立连接:QtNetwork/qnetworkreply.h

我希望这个新信息能够提高问题的质量.

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

mar*_*era 2

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

QSslConfiguration cfg(request.sslConfiguration());
cfg.setSslOption(QSsl::SslOptionDisableSessionTickets, true);
request.setSslConfiguration(cfg);
Run Code Online (Sandbox Code Playgroud)

我想特别提及 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);
Run Code Online (Sandbox Code Playgroud)