簡體   English   中英

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

[英]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之前,您可以:

  1. 安裝OpenSSL 1.0(可能在Debian中)
  2. 編譯OpenSSL 1.0並安裝它(我沒有測試,但應該工作為1.)
  3. 使用您的Qt應用程序發送OpenSSL 1.0(我沒有測試,但應該作為1.)
  4. 用“-openssl-linked”選項重新編譯Qt(根據這個答案 ,我沒有測試,我不想)

我在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。

我可以使用第二個解決方案修復問題,在我的案例中詳細說明如下:

  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,Projects> Desktop Qt 5.8.0> Build> Build Environment> Add:Variable LD_LIBRARY_PATH,Value /path/to/dir/openssl1.0(或者添加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.solibcrypto.so.1.1
libssl.solibssl.so.1.1

至:

libcrypto.solibcrypto.so.1.0.2
libssl.solibssl.so.1.0.2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM