tools - ubuntu qt widgets
Почему QsslSocket работает с Qt 5.3, а не с Qt 5.7 в Debian Stretch? (4)
Вы должны изменить эти символические ссылки: в / usr / lib / x86_64-linux-gnu форме: libcrypto.so -> libcrypto.so.1.1 libssl.so -> libssl.so.1.1
чтобы:
libcrypto.so -> libcrypto.so.1.0.2 libssl.so -> libssl.so.1.0.2
У меня есть приложение, которое использует класс QWebSocket, но не SSL. Он прекрасно работает, когда я запускаю версию, скомпилированную с Qt 5.3, но исполняемый файл Qt 5.7 зависает при следующих предупреждениях:
QSslSocket: cannot resolve CRYPTO_num_locks
QSslSocket: cannot resolve CRYPTO_set_id_callback
QSslSocket: cannot resolve CRYPTO_set_locking_callback
QSslSocket: cannot resolve ERR_free_strings
QSslSocket: cannot resolve EVP_CIPHER_CTX_cleanup
QSslSocket: cannot resolve EVP_CIPHER_CTX_init
QSslSocket: cannot resolve sk_new_null
QSslSocket: cannot resolve sk_push
QSslSocket: cannot resolve sk_free
QSslSocket: cannot resolve sk_num
QSslSocket: cannot resolve sk_pop_free
QSslSocket: cannot resolve sk_value
QSslSocket: cannot resolve SSL_library_init
QSslSocket: cannot resolve SSL_load_error_strings
QSslSocket: cannot resolve SSL_get_ex_new_index
QSslSocket: cannot resolve SSLv2_client_method
QSslSocket: cannot resolve SSLv3_client_method
QSslSocket: cannot resolve SSLv23_client_method
QSslSocket: cannot resolve SSLv2_server_method
QSslSocket: cannot resolve SSLv3_server_method
QSslSocket: cannot resolve SSLv23_server_method
QSslSocket: cannot resolve X509_STORE_CTX_get_chain
QSslSocket: cannot resolve OPENSSL_add_all_algorithms_noconf
QSslSocket: cannot resolve OPENSSL_add_all_algorithms_conf
QSslSocket: cannot resolve SSLeay
QSslSocket: cannot resolve SSLeay_version
QSslSocket: cannot call unresolved function CRYPTO_num_locks
QSslSocket: cannot call unresolved function CRYPTO_set_id_callback
QSslSocket: cannot call unresolved function CRYPTO_set_locking_callback
QSslSocket: cannot call unresolved function SSL_library_init
QSslSocket: cannot call unresolved function SSLv23_client_method
QSslSocket: cannot call unresolved function sk_num
Я не вижу этих предупреждений в версии 5.3 (которая работает должным образом), что говорит о том, что я не должен игнорировать их, как задано в этом вопросе . Также QT += network
уже есть в моем src.pro .
Я был убежден, что Debian удалил эти символы из пакета openssl . Может кто-нибудь сказать мне, что здесь происходит и как я мог это исправить?
Системная информация
Я работаю на Debian Stretch
$ uname -r
4.8.0-2-amd64
У меня установлены openssl и libssl-dev
openssl is already the newest version (1.1.0c-2).
libssl-dev is already the newest version (1.1.0c-2).
Я пытался запустить это с Qt 5.3 и 5.7
$ qmake -v
QMake version 3.0
Using Qt version 5.7.1 in /usr/lib/x86_64-linux-gnu
Вы должны установить следующий пакет, чтобы решить проблему.
sudo apt установить libssl1.0-dev
TL; DR
Debian Stretch поставляется с OpenSSL 1.1; Qt использует OpenSSL 1.0; дать Qt то, что ему нужно:
apt install libssl1.0-dev
Подробный ответ
Из этого ответа об OpenSSL и Qt я обнаружил подсказку и отобразил версию библиотеки SSL, используемую для компиляции и выполнения, используя:
qDebug()<<"SSL version use for build: "<<QSslSocket::sslLibraryBuildVersionString();
qDebug()<<"SSL version use for run-time: "<<QSslSocket::sslLibraryVersionNumber();
qDebug()<<QCoreApplication::libraryPaths();
И это отображает:
SSL version use for build: "OpenSSL 1.0.1e-fips 11 Feb 2013"
... lot of SSL warnings...
SSL version use for run-time: 0
("/opt/Qt/5.8/gcc_64/plugins", "/home/Project/..../build...Desktop_Qt_5_8_0_GCC_64bit-Release/src/release/build_linux_64")
Но Debian Stretch поставляется с OpenSSL 1.1. Как и ожидалось, все потоки в Интернете об этой проблеме верны: это проблема совместимости версий библиотеки OpenSSL.
Я "установить установить libssl1.0-dev", и проблема была решена. У меня все еще есть 2 предупреждения SSL о SSLv3, но, по крайней мере, это только предупреждение (я читал что-то об этом в Интернете, но найти его снова не смогу).
SSL version use for build: "OpenSSL 1.0.1e-fips 11 Feb 2013"
QSslSocket: cannot resolve SSLv3_client_method
QSslSocket: cannot resolve SSLv3_server_method
SSL version use for run-time: 268443839
("/opt/Qt/5.8/gcc_64/plugins", "/home/Project/..../build...Desktop_Qt_5_8_0_GCC_64bit-Release/src/release/build_linux_64")
Резюме
Пока Qt не поддерживает OpenSSL 1.1, вы можете:
- Установите OpenSSL 1.0 (возможно в Debian)
- Скомпилируйте OpenSSL 1.0 и установите его (я не тестировал, но должен работать как 1.)
- Поставьте OpenSSL 1.0 с вашим приложением Qt (я не тестировал, но должен работать как 1.)
- Перекомпилируйте Qt с опцией «-openssl-connected» (в соответствии с этим ответом я не тестировал и не хочу)
Ответ Филана не работает под Debian Buster, так как libssl1.0-dev был пакетом перехода и больше не поддерживается.
На веб-сайте Qt есть сообщение об ошибке, и из комментария Джузеппе д'Анжело есть следующие обходные пути:
Обходной путь 1
Если в вашем дистрибутиве есть каталог для OpenSSL 1.0 с правильными символическими ссылками (например, Arch имеет /usr/lib/openssl-1.0/libssl.so), используйте LD_LIBRARY_PATH, чтобы сначала выполнить поиск этого каталога.
Обходной путь 2
Создайте свой собственный каталог с символическими ссылками и используйте для этого LD_LIBRARY_PATH.
Обходной путь 3
Восстановите свой собственный Qt.
Я мог бы решить проблему, используя второе решение, команды, подробно описанные ниже в моем случае:
-
mkdir openssl1.0 ; cd openssl1.0
-
cp /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 libssl.so.1.0.2
-
ln -s libssl.so.1.0.2 libssl.so
- в QtCreator, Проекты> Desktop Qt 5.8.0> Сборка> Среда сборки> Добавить: переменная LD_LIBRARY_PATH, значение /path/to/dir/openssl1.0 (или добавить
LD_LIBRARY_PATH="/path/to/dir/openssl1.0"
перед твоя команда из консоли)
Вы могли бы сделать то же самое с libcrypto.so, но этого было достаточно для меня. Это решение предотвращает изменение символических ссылок для всей системы.