Я пытаюсь подключиться к веб-сервису, который использует SSL. Я работаю с Blackberry 10 в C ++ с 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
Тип содержимого Encrypted Alert — 21
Серверные наборы шифров находятся в списке поддерживаемых наборов шифров клиента.
Я использую следующую lib для подключения: QtNetwork / qnetworkreply.h
Я надеюсь, что эта новая информация улучшит качество вопроса.
Пожалуйста, помогите, я искал часы без успеха.
После того, как мы связались с несколькими сотрудниками 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);
Поддерживает ли ваш сервер TLS v.1? Может быть, он настроен только для SSLv2-3 или TLS v1.1-1.2
Другой возможный способ состоит в том, что нет общих клиентских и серверных шифров.
Запустите Wireshark, он покажет обмен пакетами рукопожатия. Там вы можете увидеть поддерживаемые наборы шифров, версии SSL / TLS и некоторую другую информацию.