Ошибка QSslSocket, когда SSL не используется

Я заметил этот вывод в двух моих приложениях Qt, которые используют QNetworkRequest для загрузки некоторых данных извне через QNeworkRequest:

QSslSocket: cannot resolve TLSv1_1_client_method
QSslSocket: cannot resolve TLSv1_2_client_method
QSslSocket: cannot resolve TLSv1_1_server_method
QSslSocket: cannot resolve TLSv1_2_server_method
QSslSocket: cannot resolve SSL_select_next_proto
QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
QSslSocket: cannot resolve SSL_get0_next_proto_negotiated

одним из примеров запроса, который вызывает появление этих предупреждений, является

QNetworkReply reply = m_nam->get(QNetworkRequest(QUrl("http://api.openweathermap.org/data/2.5/forecast?id=2835297&mode=xml")));

Я достаточно уверен, что в любом из запросов нет TLS/SSL, все они являются простыми HTTP. Сообщения появляются всегда после отправки первого запроса, независимо от URL-адреса. Я вообще не намерен ude SSL, в коде нет упоминания SSL, что означает, что я не могу игнорировать предупреждения программно.

моя настройка - это Windows 7 64 бит, MSVC2013 и MinGW, Qt 5.3.2. Сообщения появляются независимо от используемого компилятора. OpenSSL или другие библиотеки разработки SSL не установлены.

и вопрос: Как избавиться от этих предупреждений?

4 ответов


это только из вызова qWarning (), когда функции OpenSSL разрешены. Он не пытается вызвать эти функции, просто их разрешения. Вызов неразрешенных функций приведет к предупреждение.

предупреждение является результатом функций OpenSSL, разрешаемых во время выполнения вызовом QSslSocket::supportsSsl() static в QNetworkAccessManager::supportedSchemesImplementation() который возвращает поддерживаемые схемы - - -http и, если SSL поддерживается https.

у вас есть несколько вариантов о них предупреждения,

  1. игнорировать их, потому что вы не хотите или нужно SSL в любом случае
  2. пересобрать Qt с -no-openssl перешло к configure
  3. корабль OpenSSL так функции разрешены и https становится доступной - вероятно, не то, что вы хотите

у нас иногда были клиенты, получающие очень похожие предупреждающие сообщения, но программное обеспечение также сбой.

QSslSocket: cannot resolve TLSv1_1_client_method
QSslSocket: cannot resolve TLSv1_2_client_method
QSslSocket: cannot resolve TLSv1_1_server_method
QSslSocket: cannot resolve TLSv1_2_server_method
QSslSocket: cannot resolve SSL_select_next_proto
QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
QSslSocket: cannot resolve SSL_get0_next_proto_negotiated
QMutex: destroying locked mutex

мы определили, что это было потому, что, хотя мы не использовали SSL, программа нашла копию OpenSSL на компьютере клиента и попыталась взаимодействовать с ним. Версия, которую он нашел, была слишком старой (начиная с Qt 5.2 v1.0.0 или более поздней версии требуется).

нашим решением было распространение библиотек OpenSSL вместе с нашими приложения (~1.65 МБ). Альтернативой является компиляция Qt с нуля без поддержки OpenSSL.


можно отключить связанные предупреждающие сообщения с QLoggingCategory::setFilterRules("qt.network.ssl.w arning=false");


вы пробовали QSslSocket:: ignoreSslErrors?