Ошибка 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. Я вообще не собираюсь использовать SSL, в коде нет упоминания о SSL, что означает, что я не могу игнорировать предупреждения программно.

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

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

4 ответа

Решение

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

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

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

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

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

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

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 или более поздней).

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

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

Другие вопросы по тегам