我正在尝试连接到使用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
服务器密码套件位于客户端支持的密码套件列表中。
我正在使用以下lib进行连接:QtNetwork / qnetworkreply.h
我希望这些新信息可以提高质量。
请帮助,我一直在寻找数小时但没有成功。
答案 0 :(得分: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);
答案 1 :(得分:0)
您的服务器是否支持TLS v.1?可能它仅配置为SSLv2-3或TLS v1.1-1.2 另一种可能的方式是客户端和服务器密码套件没有共享。 运行Wireshark,它将显示握手数据包交换。在那里,您可以看到支持的密码套件,SSL / TLS版本和其他一些信息。