为什么QsslSocket在Qt 5.3上使用而不是在Debian Stretch上使用Qt 5.7?

问题描述 投票:21回答:5

我有一个使用QWebSocket class而不是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版本(正常工作)中看到这些警告,这表明我不应该忽略它们,as asked in this question。还有,QT += network is already in my src.pro

我被引导相信Debian dropped these symbols from the openssl package。谁能告诉我这里发生了什么以及如何解决这个问题?

系统信息

我正在使用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
qt ssl debian
5个回答
31
投票

TL; DR

Debian Stretch随OpenSSL 1.1一起提供; Qt使用OpenSSL 1.0;给Qt它需要什么:

apt install libssl1.0-dev

详细的答案

从这个answer about OpenSSL and 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一起提供。正如所料,Web上关于此问题的所有线程都是正确的:这是一个OpenSSL库版本兼容性问题。

我“安装libssl1.0-dev”,问题解决了。我仍然有2个关于SSLv3的SSL警告,但至少这只是警告(我在网上读到一些关于它的东西,无法再找到它)。

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. 使用您的Qt应用程序发送OpenSSL 1.0(我没有测试,但应该作为1.)
  4. 用“-openssl-linked”选项重新编译Qt(根据this answer,我没有测试,我不想)

6
投票

我在debian stretch服务器上遇到了同样的问题。我在7hibaults评论的帮助下修复了它。

运行以下命令为我解决了问题:

sudo apt-get install libssl1.0-dev

2
投票

Fylhan's answer在Debian Buster下无效,因为libssl1.0-dev是一个过渡包,不再受支持。

有关Qt网站的错误报告,Giuseppe d'Angelo's comment有以下解决方法:

解决方法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中,项目>桌面Qt 5.8.0>构建>构建环境>添加:变量LD_LIBRARY_PATH,值/path/to/dir/openssl1.0(或在控制台命令之前添加LD_LIBRARY_PATH="/path/to/dir/openssl1.0"

您可能需要对libcrypto.so执行相同的操作,但这对我来说已经足够了。此解决方案可防止您更改整个系统的符号链接。


0
投票

您必须使用以下命令安装以下软件包才能解决问题:

sudo apt install libssl1.0-dev

-1
投票

您必须在/usr/lib/x86_64-linux-gnu中更改此符号链接:

libcrypto.so libcrypto.so.1.1libssl.so libssl.so.1.1

至:

libcrypto.so libcrypto.so.1.0.2libssl.so libssl.so.1.0.2

© www.soinside.com 2019 - 2024. All rights reserved.