Ошибка 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
,
У вас есть несколько вариантов об этих предупреждениях,
- игнорируйте их, потому что вы все равно не хотите или не нуждаетесь в SSL
- перекомпилировать Qt с
-no-openssl
перешел кconfigure
- поставляем 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.