我有一个使用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
答案 0 :(得分: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 :(得分:6)
我在debian Stretch服务器上遇到了同样的问题。我借助7hibaults评论修复了该问题。
运行以下命令为我解决了该问题:
sudo apt-get install libssl1.0-dev
答案 2 :(得分: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。
我可以使用第二种解决方案来解决该问题,以下是我的案例中详细介绍的命令:
mkdir openssl1.0 ; cd openssl1.0
cp /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 libssl.so.1.0.2
ln -s libssl.so.1.0.2 libssl.so
LD_LIBRARY_PATH="/path/to/dir/openssl1.0"
) 您可能还需要对libcrypto.so做同样的事情,但这对我来说已经足够了。此解决方案可防止您更改整个系统的符号链接。
答案 3 :(得分:0)
您必须使用以下命令安装以下软件包才能解决该问题:
sudo apt install libssl1.0-dev
答案 4 :(得分:0)
我在Ubuntu 16.04上使用Qt 5.11.1遇到问题。
我通过运行
获得了用于Qt的ssl版本qDebug()<<"SSL version use for build: "<<QSslSocket::sslLibraryBuildVersionString();
哪个印刷品
SSL version use for build: "OpenSSL 1.0.2k-fips 26 Jan 2017"
我通过构建http://www.linuxfromscratch.org/blfs/view/8.0/postlfs/openssl.html处的openssl-1.0.2k
解决了这个问题。
然后运行命令进行构建
./config --prefix=./usr --openssldir=./etc/ssl --libdir=lib shared zlib-dynamic
make
制作成功后,我在当前目录中创建了以下库
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
然后打开QtCreator,项目> Desktop Qt 5.11.1 GCC 64位>构建>构建环境>添加:变量LD_LIBRARY_PATH
的值为path/openssl-1.0.2k
。
在我的情况下,LD_LIBRARY_PATH
已经存在并且具有一些值,因此我像:/home/user/Qt5.11.1/Tools/QtCreator/lib/Qt/lib::path/openssl-1.0.2k
一样对其进行了编辑
以上步骤解决了Ubuntu 16.04上Qt5.11.1的ssl警告问题。
答案 5 :(得分:-1)
您必须在/usr/lib/x86_64-linux-gnu
中更改此符号链接:
libcrypto.so
→libcrypto.so.1.1
libssl.so
→libssl.so.1.1
为:
libcrypto.so
→libcrypto.so.1.0.2
libssl.so
→libssl.so.1.0.2