Почему 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, вы можете:
- Установите OpenSSL 1.0 (возможно в Debian)
- Скомпилируйте OpenSSL 1.0 и установите его (я не тестировал, но должен работать как 1.)
- Поставьте OpenSSL 1.0 с вашим приложением Qt (я не тестировал, но должен работать как 1.)
- Перекомпилируйте 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.
Я мог бы решить проблему, используя второе решение, команды, подробно описанные ниже в моем случае:
-
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, но этого мне было достаточно. Это решение предотвращает изменение символических ссылок для всей системы.
Ответ 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.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
Ответ 7
Я попытался sudo apt установить libssl1.0-dev, но пакет не может быть найден
Что я могу сделать? я на Ubuntu 19.04