BB10 QNX Momentics IDE 中的 SSL 握手失败

Posted

技术标签:

【中文标题】BB10 QNX Momentics IDE 中的 SSL 握手失败【英文标题】:SSL Handshake Failed in BB10 QNX Momentics IDE 【发布时间】:2012-11-16 19:39:53 【问题描述】:

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

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

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

【问题讨论】:

证书是否有可能过期? 证书未过期。谢谢@RodrigoHahn 【参考方案1】:

在就这个特定问题与一些 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);

【讨论】:

这是非常有用的代码,但我有一个问题。这对我来说很慢,在模拟器和真实设备中也是如此。你知道它可能是什么吗?【参考方案2】:

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

【讨论】:

嗨。我只是与 Wireshark 核对,服务器密码套件在客户端密码套件支持列表中。我仍然无法连接或找出问题所在。感谢wireshark,我也知道连接以加密警报类型21结束。我将编辑问题以添加wireshark信息。

以上是关于BB10 QNX Momentics IDE 中的 SSL 握手失败的主要内容,如果未能解决你的问题,请参考以下文章

支持qnx中的cmake??从 Linux 移植到 QNX

[QNX Hypervisor 2.2用户手册]7.2.3 更新Hypervisor事件追踪描述(可选)

[QNX Hypervisor 2.2用户手册]10 虚拟设备参考

BB10 SDK离线安装步骤

[QNX Hypervisor 2.2用户手册]10.21 vdev wdt-sp805

[QNX Hypervisor 2.2用户手册]10.20 vdev wdt-ib700