LINUX.ORG.RU

QNetworkAccessManager, HTTPS и OpenSSL в 2018 году - давайте таки разберемся

 , ,


1

2

Смотрим сюда:

http://www.cyberforum.ru/qt/thread1850684.html

Как в 2018 годе начать работать в Qt с HTTPS ?

Разломали это дело году в 2016, не починили до сих пор. На Debian 9 Stable 64 bit и Qt 5.10.1 имеем:

13:03:19 [WRN] QSslSocket: cannot call unresolved function SSLv23_client_method
13:03:19 [WRN] QSslSocket: cannot call unresolved function SSL_CTX_new
13:03:19 [WRN] QSslSocket: cannot call unresolved function SSL_library_init
13:03:19 [WRN] QSslSocket: cannot call unresolved function ERR_get_error
13:03:19 [WRN] QSslSocket: cannot call unresolved function ERR_get_error

В системе стоит openssl 1.1.0f-3+deb9u2.

Под Windows QNetworkAccessManager с HTTPS работает нормально.

Как заставить работать QNetworkAccessManager на Linux? Да причем так, чтобы программа с QNetworkAccessManager устанавливалась у пользователя и не требовала разламывать зависимости в дистрибутиве?

★★★★★

По поводу зависимостей:

// файл project.pro
// добавляем к QMAKE_RPATHDIR значение lib
QMAKE_RPATHDIR += lib
Теперь все требуемые библиотеки располагаем в каталоге lib/, который в каталоге с исполняемым файлом. И таким образом, можно распространять свое приложение вместе с библиотеками, не ломая зависимостей в системе.

rumgot ★★★ ()
Последнее исправление: rumgot (всего исправлений: 1)

Как заставить работать QNetworkAccessManager на Linux?

А он разве не работает? То что ты процитировал - предупреждения, не ошибки. Нужны конкретные ошибки от QNetworkAccessManager. Ты обрабатываешь сигнал sslErrors()?

former_anonymous ★★ ()
Ответ на: комментарий от former_anonymous

Вот тестовый пример от EXL.

https://github.com/EXLMOTODEV/NetworkManagerDemo

Он говорит что у него работает. А на моем линухе при нажатии Go в консоль выдаются предупреждения, и скачивания не происходит:

Запускается /build-NetworkManagerDemo-Desktop_Qt_5_10_1_GCC_64bit-Debug/NetworkManagerDemo...
qt.network.ssl: QSslSocket: cannot resolve CRYPTO_num_locks
qt.network.ssl: QSslSocket: cannot resolve CRYPTO_set_id_callback
qt.network.ssl: QSslSocket: cannot resolve CRYPTO_set_locking_callback
qt.network.ssl: QSslSocket: cannot resolve ERR_free_strings
qt.network.ssl: QSslSocket: cannot resolve EVP_CIPHER_CTX_cleanup
qt.network.ssl: QSslSocket: cannot resolve EVP_CIPHER_CTX_init
qt.network.ssl: QSslSocket: cannot resolve sk_new_null
qt.network.ssl: QSslSocket: cannot resolve sk_push
qt.network.ssl: QSslSocket: cannot resolve sk_free
qt.network.ssl: QSslSocket: cannot resolve sk_num
qt.network.ssl: QSslSocket: cannot resolve sk_pop_free
qt.network.ssl: QSslSocket: cannot resolve sk_value
qt.network.ssl: QSslSocket: cannot resolve SSL_library_init
qt.network.ssl: QSslSocket: cannot resolve SSL_load_error_strings
qt.network.ssl: QSslSocket: cannot resolve SSL_get_ex_new_index
qt.network.ssl: QSslSocket: cannot resolve SSLv3_client_method
qt.network.ssl: QSslSocket: cannot resolve SSLv23_client_method
qt.network.ssl: QSslSocket: cannot resolve SSLv3_server_method
qt.network.ssl: QSslSocket: cannot resolve SSLv23_server_method
qt.network.ssl: QSslSocket: cannot resolve X509_STORE_CTX_get_chain
qt.network.ssl: QSslSocket: cannot resolve OPENSSL_add_all_algorithms_noconf
qt.network.ssl: QSslSocket: cannot resolve OPENSSL_add_all_algorithms_conf
qt.network.ssl: QSslSocket: cannot resolve SSLeay
qt.network.ssl: Incompatible version of OpenSSL
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

В дистрах Linux часто есть несколько версий SSL библиотек. Если ты поставил openssl 1.1.0, то думаю автоматом установился libssl1.1. Попробуй поставь libssl1.0.2.

former_anonymous ★★ ()
Последнее исправление: former_anonymous (всего исправлений: 1)
Ответ на: комментарий от former_anonymous

Если ты поставил openssl 1.1.0, то думаю автоматом установился libssl1.1. Попробуй поставь libssl1.0.2.

У меня и то и то установлено:

> aptitude -F "%c%a%M%S %p %Z %v %V" search ssl | grep "^i"
i    libssl1.0.2  1.0.2l-2+deb9u3 1.0.2l-2+deb9u3
i    libssl1.1    1.1.0f-3+deb9u2 1.1.0f-3+deb9u2
i A  openssl      1.1.0f-3+deb9u2 1.1.0f-3+deb9u2

i - это флаг что установлено, A - это флаг что установлено автоматически.

Xintrea ★★★★★ ()
dpkg -l | grep openssl
ii    openssl    1.1.0f-3+deb9u2    amd64    Secure Sockets Layer toolkit - cryptographic utility

Qt-проекты, использующие SSL собираются и даже работают, защищенное соединение устанавливается. Как с Qt 5.9.0 (скачано с офсайта), так и с Qt 5.7.1 (из репозиториев).

s3rjke ()
Ответ на: комментарий от former_anonymous

Ну я щас раздумываю, поставить дефолтный Qt или нет. Как то я ставил несколько Qt, аккуратно, в разные каталоги, но в Qt есть автопоиск, и помню в какой-то момент один Qt подцепил куски и документацию от другого Qt, получился бардак.

Xintrea ★★★★★ ()
Ответ на: комментарий от s3rjke

Qt-проекты, использующие SSL собираются и даже работают, защищенное соединение устанавливается. Как с Qt 5.9.0 (скачано с офсайта), так и с Qt 5.7.1 (из репозиториев).

Проверь в Qt 5.9.0 на проекте:

https://github.com/EXLMOTODEV/NetworkManagerDemo

Правда, видимо, он может подхватить системный кусок SSL, установленный вместе с Qt 5.7.1, если у тебя все работает.

У меня на Debian 9 Stable 64 bit ни Qt 5.9.0, ни Qt 5.10.1 с HTTPS не работают (Qt из репозитария еще не ставил).

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Немного обновил проект по ссылке.

Официальный Qt (не из реп) собран с OpenSSL 1.0.x, так что вам нужно прокинуть путь именно до этой версии библиотеки, у вас она видимо уже установлена и имеет версию 1.0.2l. Это можно сделать, например, с помощью переменной окружения LD_LIBRARY_PATH.

В Arch Linux, работает так:

$ git clone https://github.com/EXLMOTODEV/NetworkManagerDemo
$ cd NetworkManagerDemo/
$ /opt/Qt5.10.1/5.10.1/gcc_64/bin/qmake NetworkManagerDemo.pro
$ make
$ ls /usr/lib/openssl-1.0/ -al
total 256
drwxr-xr-x   4 root root   4096 Apr  9 16:17 .
drwxr-xr-x 203 root root 245760 May 19 22:59 ..
drwxr-xr-x   2 root root   4096 Apr  9 16:17 engines
lrwxrwxrwx   1 root root     21 Mar 31 23:45 libcrypto.so -> ../libcrypto.so.1.0.0
lrwxrwxrwx   1 root root     18 Mar 31 23:45 libssl.so -> ../libssl.so.1.0.0
drwxr-xr-x   2 root root   4096 Apr  9 16:17 pkgconfig
LD_LIBRARY_PATH=/usr/lib/openssl-1.0/:$LD_LIBRARY_PATH ./NetworkManagerDemo
<всё работает>

Заметьте, что библиотеки, которые расположены по указанному пути, должны называться именно как libcrypto.so и libssl.so, а не libcrypto.so.1.0.0 и libssl.so.1.0.0, кстати, проблем с опакеченым мейнтейнерами Qt'ом быть не должно.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Хм, в моем случае из пакета libssl1.0.2 устанавливаются файлы:

/usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.2
/usr/lib/x86_64-linux-gnu/libssl.so.1.0.2

Есть еще каталог
/usr/lib/x86_64-linux-gnu/openssl-1.0.2

Но в нем линков нет, только подкаталог engines. Сделал в нем линки вручную:
ln -s ../libcrypto.so.1.0.2 libcrypto.so
ln -s ../libssl.so.1.0.2 libssl.so

Запускаю бинарь так:
LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/openssl-1.0.2/:$LD_LIBRARY_PATH ./NetworkManagerDemo

В таком виде заработало, только в выхлопе появляются предупреждения:
qt.network.ssl: QSslSocket: cannot resolve SSLv3_client_method
qt.network.ssl: QSslSocket: cannot resolve SSLv3_server_method

Но хотя бы работает, благодарю.

Xintrea ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Не знаю точно. Скорее всего не очень давно, т.к. в первых версиях Qt5 это не работало и нужно было устанавливать RPATH по другому.

Правильно понимаю, что это runtime каталог для либ?

Правильно, но я бы выразился так: этот параметр для qmake, который устанавливает в исполняемом файле значение RPATH. RPATH - специальный параметр в исполняемом файле, который определяет список каталогов, в которых ищутся динамические библиотеки при выполнении.

rumgot ★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Да. Пожалуйста, распространяй приложение со своими либами. И никакого ада зависимостей, вообще с точки зрения того, что любую программу можно поставлять вместе с требуемыми библиотеками, используя параметр rpath в исполняемом файле, не понимаю всю эту шумиху про проблемы зависимостей, необходимость всяких AppImage и прочее...

rumgot ★★★ ()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от rumgot

Проблема только в том, что когда выйдет очередной heartbleed, все поставляльщики приложений со своими либами должны будут срочно обновить себе либу и приложение клиентам.

vzzo ★★★ ()
Ответ на: комментарий от Xintrea

Запускается.

SSL version use for build: OpenSSL 1.0.1e-fips 11 Feb 2013
SSL version use for run-time: OpenSSL 1.0.2l  25 May 2017
SSL support: 1
При нажатии кнопки Go! закружает какую-то html-страничку, судя по всему.

s3rjke ()
Ответ на: комментарий от rumgot

Пожалуйста, распространяй приложение со своими либами. И никакого ада зависимостей

Если ядро вообще сможет этот бинарник и либу запустить, и libc будет нужной версии, а это никто гарантировать не может.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Если ядро вообще сможет этот бинарник и либу запустить

а что, может не смочь?

и libc будет нужной версии, а это никто гарантировать не может.

У glibc полная обратная совместимость, код собранный со старой версией всегда заработает с более новой

annulen ★★★★★ ()