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

7hi*_*ult 24 ssl debian qt

我有一个使用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
Run Code Online (Sandbox Code Playgroud)

我没有在5.3版本(正常工作)中看到这些警告,这表明我不应该忽略它们,正如这个问题所要求的那样.此外,QT += network已经在我的src.pro中.

我被引导相信Debian从openssl包中删除了这些符号.谁能告诉我这里发生了什么以及如何解决这个问题?

系统信息

我正在使用Debian延伸

$ uname -r
4.8.0-2-amd64
Run Code Online (Sandbox Code Playgroud)

我安装了openssl和libssl-dev

openssl is already the newest version (1.1.0c-2). 
libssl-dev is already the newest version (1.1.0c-2).
Run Code Online (Sandbox Code Playgroud)

我尝试用Qt 5.3和5.7运行它

$ qmake -v
QMake version 3.0
Using Qt version 5.7.1 in /usr/lib/x86_64-linux-gnu
Run Code Online (Sandbox Code Playgroud)

Fyl*_*han 33

TL; DR

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

apt install libssl1.0-dev
Run Code Online (Sandbox Code Playgroud)

详细的答案

从这个关于OpenSSL和Qt的答案中,我找到了一个提示,我使用以下方法显示了用于编译时和运行时的SSL库版本:

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

它显示:

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")
Run Code Online (Sandbox Code Playgroud)

但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")
Run Code Online (Sandbox Code Playgroud)

摘要

在Qt支持OpenSSL 1.1之前,您可以:

  1. 安装OpenSSL 1.0(可能在Debian中)
  2. 编译OpenSSL 1.0并安装它(我没有测试,但应该工作为1.)
  3. 使用您的Qt应用程序发送OpenSSL 1.0(我没有测试,但应该作为1.)
  4. 用"-openssl-linked"选项重新编译Qt(根据这个答案,我没有测试,我不想)

  • *apt install libssl1.0-dev*做了诀窍,谢谢;) (5认同)
  • 亲爱的7hibault,您的评论应该是接受的答案,您保存了我的整个星期!谢谢! (2认同)

小智 6

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

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

__CODE__

  • 我在 Ubuntu 16.04 上遇到以下错误:E: Package 'libssl1.0-dev' has no installationCandidate (3认同)

小智 6

对于那些使用Ubuntu 的 用户,18.04+您可以使用这个构建版本,它也适用于较新的版本。

sudo apt-add-repository -y ppa:rael-gc/rvm
sudo apt-get update
sudo apt-get install libssl1.0-dev 
Run Code Online (Sandbox Code Playgroud)