BB10 QNX Momentics IDE 中 SSL 握手失败

11

我正在尝试连接一个使用SSL的Web服务。我正在使用Blackberry 10在QNX IDE Momentics中使用C++进行开发。我尝试做的连接如下所示:

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。

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

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

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

请帮忙,我已经搜索了数小时但没有成功。


有过期证书的可能性吗? - Please treat your mods well.
证书没有过期。感谢@RodrigoHahn。 - mariomunera
2个回答

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

这是非常有用的代码,但我有一个问题。在模拟器和真实设备上都非常慢。 你有什么想法是什么原因吗? - LILkillaBEE

0

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


嗨。我刚用Wireshark检查了一下,发现服务器密码套件在客户端支持的密码套件列表中。但我仍然无法连接或找出问题所在。感谢Wireshark,我也知道连接最终以加密警报类型21结束。我将编辑问题以添加Wireshark信息。 - mariomunera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接