[英]Why is QsslSocket working with Qt 5.3 but not Qt 5.7 on Debian Stretch?
我有一個使用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 版本(正常工作)中沒有看到這些警告,這表明我不應該忽略它們, 正如在這個問題中所問的那樣。 此外, QT += network
已經在我的 src.pro 中。
我被引導相信Debian 從 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
TL; DR
Debian Stretch隨OpenSSL 1.1一起提供; Qt使用OpenSSL 1.0; 給Qt它需要什么:
apt install libssl1.0-dev
詳細的答案
從這個關於OpenSSL和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之前,您可以:
我在debian stretch服務器上遇到了同樣的問題。 我在7hibaults評論的幫助下修復了它。
運行以下命令為我解決了問題:
sudo apt-get install libssl1.0-dev
Fylhan的回答在Debian Buster下不起作用,因為libssl1.0-dev是一個過渡包,不再受支持了。
有關Qt網站的錯誤報告,並且從Giuseppe d'Angelo的評論中有以下解決方法:
解決方法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執行相同的操作,但這對我來說已經足夠了。 此解決方案可防止您更改整個系統的符號鏈接。
您必須使用以下命令安裝以下軟件包才能解決問題:
sudo apt install libssl1.0-dev
我在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"
我通過構建openssl-1.0.2k
從這里解決了這個問題http://www.linuxfromscratch.org/blfs/view/8.0/postlfs/openssl.html 。
然后運行命令來構建
./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,Projects> Desktop Qt 5.11.1 GCC 64bit> Build> Build Environment> Add:Variable 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警告問題。
對於那些使用Ubuntu 18.04+
你可以使用這個構建它也適用於較新的版本。
sudo apt-add-repository -y ppa:rael-gc/rvm
sudo apt-get update
sudo apt-get install libssl1.0-dev
如果您使用的是 Debian 11(靶心),並且無法安裝libssl1.0-dev
,請執行以下操作:
添加以下兩個來源
echo "deb http://deb.debian.org/debian/ stretch main contrib non-free" >> /etc/apt/sources.list.d/source.list
echo "deb-src http://deb.debian.org/debian stretch main contrib non-free" >> /etc/apt/sources.list.d/source.list
然后運行apt-get update
最后apt install libssl1.0-dev
這是更多信息的 來源。
您必須在/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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.