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

У меня есть приложение, которое использует класс 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

$ 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

Ответ 1

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" (в соответствии с этим ответом я не тестировал и не хочу)

Ответ 2

У меня была такая же проблема на стретч-сервере Debian. Я исправил это с помощью комментария 7hibaults.

Выполнение следующей команды устранило проблему для меня:

sudo apt-get install libssl1.0-dev

Ответ 3

Ответ Fylhan не работает под 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, но этого мне было достаточно. Это решение предотвращает изменение символических ссылок для всей системы.

Ответ 4

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

sudo apt install libssl1.0-dev

Ответ 5

У меня проблема с Qt 5.11.1 в Ubuntu 16.04.

Я получил версию ssl, используемую для Qt, запустив

qDebug()<<"SSL version use for build: "<<QSslSocket::sslLibraryBuildVersionString();

Какая печать

SSL version use for build: "OpenSSL 1.0.2k-fips 26 Jan 2017"

Я решил проблему, собрав openssl-1.0.2k отсюда http://www.linuxfromscratch.org/blfs/view/8.0/postlfs/openssl.html.

Затем выполните команду для сборки

./config --prefix=./usr --openssldir=./etc/ssl  --libdir=lib   shared   zlib-dynamic
make

После успешного завершения make я получил сборку библиотеки в текущем каталоге

path/openssl-1.0.2k/libssl.so.1.0.0
path/openssl-1.0.2k/libssl.so
path/openssl-1.0.2k/libcrypto.so.1.0.0
path/openssl-1.0.2k/libcrypto.so 

Затем откройте QtCreator, Проекты> Desktop Qt 5.11.1 GCC 64bit> Build> Среда сборки> Add: переменная LD_LIBRARY_PATH со значением path/openssl-1.0.2k.

В моем случае LD_LIBRARY_PATH уже существует с некоторым значением, поэтому я отредактировал его как :/home/user/Qt5.11.1/Tools/QtCreator/lib/Qt/lib::path/openssl-1.0.2k

Вышеуказанные шаги решают проблему предупреждения ssl с Qt5.11.1 в Ubuntu 16.04.

Ответ 6

Вы должны изменить эти символические ссылки в /usr/lib/x86_64-linux-gnu из:

libcrypto.solibcrypto.so.1.1
libssl.solibssl.so.1.1

чтобы:

libcrypto.solibcrypto.so.1.0.2
libssl.solibssl.so.1.0.2

Ответ 7

Я попытался sudo apt установить libssl1.0-dev, но пакет не может быть найден

Что я могу сделать? я на Ubuntu 19.04