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
我希望这个新信息能够提高问题的质量.
请帮忙,我一直在寻找几个小时没有成功.
在就这个特定问题与一些 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)