jessie - Почему QsslSocket работает с Qt 5.3, а не с Qt 5.7 в Debian Stretch?



qt debian jessie (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

Answer #1

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

sudo apt установить libssl1.0-dev


Answer #2

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, вы можете:

  1. Установите OpenSSL 1.0 (возможно в Debian)
  2. Скомпилируйте OpenSSL 1.0 и установите его (я не тестировал, но должен работать как 1.)
  3. Поставьте OpenSSL 1.0 с вашим приложением Qt (я не тестировал, но должен работать как 1.)
  4. Перекомпилируйте Qt с опцией «-openssl-connected» (в соответствии с этим ответом я не тестировал и не хочу)

Answer #3

Ответ Филана не работает под 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.

Я мог бы решить проблему, используя второе решение, команды, подробно описанные ниже в моем случае:

  1. mkdir openssl1.0 ; cd openssl1.0
  2. cp /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 libssl.so.1.0.2
  3. ln -s libssl.so.1.0.2 libssl.so
  4. в QtCreator, Проекты> Desktop Qt 5.8.0> Сборка> Среда сборки> Добавить: переменная LD_LIBRARY_PATH, значение /path/to/dir/openssl1.0 (или добавить LD_LIBRARY_PATH="/path/to/dir/openssl1.0" перед твоя команда из консоли)

Вы могли бы сделать то же самое с libcrypto.so, но этого было достаточно для меня. Это решение предотвращает изменение символических ссылок для всей системы.





debian