11

我正在尝试连接到使用 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

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

我正在使用以下库进行连接:QtNetwork/qnetworkreply.h

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

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

4

2 回答 2

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);
于 2013-01-10T14:16:48.113 回答
0

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

于 2012-12-10T10:57:02.093 回答