Подтверждение SSL не выполнено в среде BB10 QNX Momentics IDE
Я пытаюсь подключиться к веб-службе, использующей SSL. Я работаю с Blackberry 10 на С++ с помощью QNX IDE Momentics. Соединение, которое я пытаюсь сделать, выглядит следующим образом:
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
Сервер ciphersuites находится в списке поддерживаемых ciphersuites клиента.
Я использую следующую lib для соединения: QtNetwork/qnetworkreply.h
Я надеюсь, что эта новая информация улучшит качество вопроса.
Пожалуйста, помогите, я искал часы без успеха.
Ответы
Ответ 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
Другим возможным способом является то, что нет общих для клиентов и серверных ciphersuites.
Запустите Wireshark, он покажет обмен пакетами handshake. Там вы можете увидеть поддерживаемые ciphersuites, версии SSL/TLS и некоторую другую информацию.