it-swarm-eu.dev

Dlaczego QsslSocket współpracuje z Qt 5.3, ale nie Qt 5.7 w Debian Stretch?

Mam aplikację, która używa klasy QWebSocket , ale nie SSL. Działa dobrze, gdy wykonuję wersję skompilowaną z Qt 5.3, ale plik wykonywalny Qt 5.7 zawiesza się na następujących ostrzeżeniach:

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

Nie widzę tych ostrzeżeń w wersji 5.3 (która działa poprawnie), co sugeruje, że nie powinienem ich ignorować jak to zostało zadane w tym pytaniu . Również QT += network jest już w moim src.pro .

Dowiedziałem się, że Debian usunął te symbole z pakietu openssl . Czy ktoś mógłby mi powiedzieć, co tu się dzieje i jak mogę to naprawić?

Informacje o systemie

Pracuję na odcinku Debian

$ uname -r
4.8.0-2-AMD64

Mam zainstalowane openssl i libssl-dev

openssl is already the newest version (1.1.0c-2). 
libssl-dev is already the newest version (1.1.0c-2).

Próbowałem uruchomić to z Qt 5.3 i 5.7

$ qmake -v
QMake version 3.0
Using Qt version 5.7.1 in /usr/lib/x86_64-linux-gnu
18
7hibault

TL; DR

Debian Stretch jest dostarczany z OpenSSL 1.1; Qt używa OpenSSL 1.0; daj Qt, czego potrzebuje:

apt install libssl1.0-dev

Szczegółowa odpowiedź

Z tego odpowiedź na temat OpenSSL i Qt znalazłem podpowiedź i wyświetlałem wersję biblioteki SSL używaną do kompilacji i uruchamiania przy użyciu:

qDebug()<<"SSL version use for build: "<<QSslSocket::sslLibraryBuildVersionString();
qDebug()<<"SSL version use for run-time: "<<QSslSocket::sslLibraryVersionNumber();
qDebug()<<QCoreApplication::libraryPaths();

I wyświetla:

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")

Ale Debian Stretch jest dostarczany z OpenSSL 1.1. Zgodnie z oczekiwaniami wszystkie wątki w sieci dotyczące tego problemu są prawdziwe: jest to problem ze zgodnością wersji biblioteki OpenSSL.

„Apt install libssl1.0-dev” i problem został rozwiązany. Nadal mam 2 ostrzeżenia SSL o SSLv3, ale przynajmniej to jest tylko ostrzeżenie (czytam o tym w sieci, nie mogę go znaleźć ponownie). 

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")

Streszczenie

Dopóki Qt nie obsługuje OpenSSL 1.1, możesz:

  1. Zainstaluj OpenSSL 1.0 (możliwe w Debianie)
  2. Skompiluj OpenSSL 1.0 i zainstaluj go (nie testowałem, ale powinien działać jako 1.)
  3. Wysyłaj OpenSSL 1.0 z aplikacją Qt (nie testowałem, ale powinien działać jako 1.)
  4. Ponownie skompiluj Qt opcją „-openssl-link” (zgodnie z ta odpowiedź , nie testowałem i nie chcę)
25
Fylhan

Miałem ten sam problem na serwerze rozciągania Debiana. Naprawiłem to za pomocą komentarza 7hibaults.

Uruchomienie poniższej komendy rozwiązało problem dla mnie:

Sudo apt-get install libssl1.0-dev

6
user3733632

Odpowiedź Fylhana nie działa w Debianie Bustera, ponieważ libssl1.0-dev był pakietem przejściowym i nie jest już obsługiwany.

Istnieje raport o błędzie na stronie internetowej Qt i od komentarz Giuseppe d'Angelo istnieją następujące obejścia:

Obejście 1

Jeśli twoja dystrybucja ma katalog dla OpenSSL 1.0 z prawą dowiązania symboliczne (np. Arch ma /usr/lib/openssl-1.0/libssl.so) używają LD_LIBRARY_PATH, aby najpierw wymusić przeszukanie tego katalogu.

Obejście 2

Stwórz swój własny katalog z dowiązaniami symbolicznymi i użyj LD_LIBRARY_PATH dla że.

Obejście 3

Odbuduj swój własny Qt.

Mogłem rozwiązać problem za pomocą drugiego rozwiązania, komendy opisane poniżej w moim przypadku:

  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. w QtCreator, Projekty> Desktop Qt 5.8.0> Build> Build Environment> Add: Variable LD_LIBRARY_PATH, Value /path/to/dir/openss1.0 (lub dodaj LD_LIBRARY_PATH="/path/to/dir/openssl1.0" przed komendą z konsoli)

Możesz także zrobić to samo z libcrypto.so, ale to mi wystarczyło. To rozwiązanie uniemożliwia zmianę dowiązań symbolicznych dla całego systemu.

1
Arnaud M.

Aby rozwiązać problem, musisz zainstalować następujący pakiet.

Sudo apt install libssl1.0-dev

0
Sougata Pal

Mam problem z Qt 5.11.1 na Ubuntu 16.04.

Mam uruchomioną wersję SSL używaną do Qt

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

Który druk

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

Rozwiązałem problem, budując openssl-1.0.2k dostałem stąd http://www.linuxfromscratch.org/blfs/view/8.0/postlfs/openssl.html .

Następnie uruchom polecenie, aby skompilować

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

Po pomyślnym zakończeniu tworzenia otrzymałem następującą kompilację biblioteki w bieżącym katalogu

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 

Następnie otwórz QtCreator, Projekty> Desktop Qt 5.11.1 GCC 64bit> Kompilacja> Środowisko kompilacji> Dodaj: Zmienna LD_LIBRARY_PATH z wartością path/openssl-1.0.2k.

W moim przypadku LD_LIBRARY_PATH już istnieje z pewną wartością, więc edytowałem go jak :/home/user/Qt5.11.1/Tools/QtCreator/lib/Qt/lib::path/openssl-1.0.2k

Powyższe kroki rozwiązują problem ostrzeżenia ssl z Qt5.11.1 na Ubuntu 16.04.

0
Haris