it-swarm.com.de

Warum arbeitet QsslSocket mit Qt 5.3, aber nicht mit Qt 5.7 unter Debian Stretch?

Ich habe eine App, die die QWebSocket-Klasse verwendet aber nicht SSL. Es funktioniert gut, wenn ich eine mit Qt 5.3 kompilierte Version ausführe, aber eine ausführbare Qt 5.7-Datei friert die folgenden Warnungen ein:

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

Ich sehe diese Warnungen nicht in der Version 5.3 (das funktioniert einwandfrei), was darauf hindeutet, dass ich sie nicht ignorieren sollte, wie in dieser Frage gestellt . Außerdem ist QT += network bereits in meiner src.pro .

Ich war überzeugt, dass Debian diese Symbole aus dem openssl-Paket gelöscht hat . Könnte mir jemand sagen, was hier los ist und wie ich das reparieren könnte?

System Information

Ich renne auf Debian-Strecke

$ uname -r
4.8.0-2-AMD64

Ich habe openssl und libssl-dev installiert

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

Ich habe versucht, dies mit Qt 5.3 und 5.7 auszuführen

$ 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 wird mit OpenSSL 1.1 ausgeliefert. Qt verwendet OpenSSL 1.0; gib Qt was es braucht:

apt install libssl1.0-dev

Ausführliche Antwort

Von dieser Antwort auf OpenSSL und Qt habe ich einen Hinweis gefunden und die für die Kompilierungszeit und Laufzeit verwendete SSL-Bibliotheksversion angezeigt:

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

Und es zeigt:

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 wird jedoch mit OpenSSL 1.1 ausgeliefert. Wie erwartet, sind alle Threads im Web zu diesem Problem zutreffend: Dies ist ein Kompatibilitätsproblem der OpenSSL-Bibliotheksversion.

Ich "apt install libssl1.0-dev" und das Problem wurde gelöst. Ich habe noch zwei SSL-Warnungen zu SSLv3, aber dies ist zumindest eine Warnung (ich habe etwas im Web darüber gelesen, keine Möglichkeit, es wieder zu finden). 

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

Zusammenfassung

Bis Qt OpenSSL 1.1 unterstützt, können Sie entweder:

  1. Installiere OpenSSL 1.0 (möglich in Debian)
  2. Kompiliere OpenSSL 1.0 und installiere es (Ich habe nicht getestet, sollte aber als 1. funktionieren)
  3. Versenden Sie OpenSSL 1.0 mit Ihrer Qt-Anwendung (Ich habe nicht getestet, sollte aber als 1 funktionieren.)
  4. Qt mit der Option "-openssl-linked" neu kompilieren (laut dieser Antwort habe ich nicht getestet und möchte dies nicht)
25
Fylhan

Ich hatte das gleiche Problem auf einem Debian-Stretch-Server. Ich habe es mit Hilfe des 7heaults Kommentar behoben.

Durch Ausführen des folgenden Befehls wurde das Problem für mich behoben:

Sudo apt-get install libssl1.0-dev

6
user3733632

Fylhans Antwort funktioniert nicht unter Debian Buster, da libssl1.0-dev ein Übergangspaket war und nicht mehr unterstützt wird.

Es gibt einen Fehlerbericht auf der Qt-Website und aus Giuseppe d'Angelos Kommentar es gibt folgende Problemumgehungen:

Abhilfe 1

Wenn Ihre Distribution ein Verzeichnis für OpenSSL 1.0 mit der rechten Symlinks (z. B. Arch verwendet /usr/lib/openssl-1.0/libssl.so) verwendet LD_LIBRARY_PATH, um das Verzeichnis zuerst zu durchsuchen.

Abhilfe 2

Erstellen Sie ein eigenes Verzeichnis mit Symlinks und verwenden Sie LD_LIBRARY_PATH für Das.

Abhilfe 3

Baue dein eigenes Qt neu auf.

Ich könnte das Problem mit der zweiten Lösung beheben, die in meinem Fall unten beschrieben wird:

  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. in QtCreator, Projekte> Desktop Qt 5.8.0> Erstellen> Erstellungsumgebung> Hinzufügen: Variable LD_LIBRARY_PATH, Wert /path/to/dir/openssl1.0 (oder fügen Sie LD_LIBRARY_PATH="/path/to/dir/openssl1.0" vor Ihrem Befehl über die Konsole hinzu)

Möglicherweise müssen Sie dasselbe auch mit libcrypto.so tun, aber das war genug für mich. Diese Lösung verhindert, dass Sie die Symlinks für das gesamte System ändern.

1
Arnaud M.

Sie müssen das folgende Paket installieren, um das Problem zu beheben.

Sudo apt install libssl1.0-dev

0
Sougata Pal

Ich habe ein Problem mit Qt 5.11.1 unter Ubuntu 16.04.

Ich habe die SSL-Version für Qt durch Laufen

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

Welcher Druck

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

Ich habe das Problem gelöst, indem ich openssl-1.0.2k Erstellt habe, das ich von hier erhalten habe http://www.linuxfromscratch.org/blfs/view/8.0/postlfs/openssl.html .

Führen Sie dann den zu erstellenden Befehl aus

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

Nachdem make erfolgreich abgeschlossen wurde, habe ich folgende Bibliothek im aktuellen Verzeichnis erstellt

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 

Öffnen Sie dann QtCreator, Projekte> Desktop Qt 5.11.1 GCC 64bit> Erstellen> Build-Umgebung> Hinzufügen: Variable LD_LIBRARY_PATH Mit dem Wert path/openssl-1.0.2k.

In meinem Fall existiert LD_LIBRARY_PATH Bereits mit einem Wert, so dass ich ihn wie :/home/user/Qt5.11.1/Tools/QtCreator/lib/Qt/lib::path/openssl-1.0.2k Bearbeitet habe.

Die obigen Schritte beheben das Problem der SSL-Warnung mit Qt5.11.1 unter Ubuntu 16.04.

0
Haris