【问题标题】:Why is QsslSocket working with Qt 5.3 but not Qt 5.7 on Debian Stretch?为什么 QsslSocket 在 Debian Stretch 上使用 Qt 5.3 而不是 Qt 5.7?
【发布时间】:2017-02-07 15:51:29
【问题描述】:

我有一个使用 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

【问题讨论】:

  • 我有同样的问题,我一直坚持...仍在搜索...有关此的更多信息: * 在我的 Debian Stretch 上,此问题发生在所有 Qt 版本(Qt5.3 , 5.6, 5.7, 5.8)。它适用于我的同事的 Qt5.3。所以这可能是由于 Qt 版本的安装方式,而不是 Qt 版本本身。 * 它只发生在 WebSocket 客户端,而不是 WebSocket 服务器。

标签: qt ssl debian


【解决方案1】:

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 一起提供的。正如预期的那样,网络上关于这个问题的所有线程都是真实的:这是一个 OpenSSL 库版本兼容性问题。

我“apt install 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,我没有测试也不想测试)

【讨论】:

  • 亲爱的 7hibault,您的评论应该是公认的答案,您拯救了我的整个星期!谢谢!
  • 那些 qDebug 行是我找出我的 Qt 在 Windows 上构建的 OpenSSL 版本以解决 DLL Hell 的诀窍。具体来说,QSslSocket::sslLibraryBuildVersionString() 是票。
  • 更新:自 Qt5.10 起支持 OpenSSL 1.1,但您必须使用适当的配置重新构建它(请参阅 forum.qt.io/topic/103139/openssl-1-1-1-support/ 3)。自 Qt 5.12.4 (blog.qt.io/blog/2019/06/17/…) 起默认集成。
【解决方案2】:

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

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

sudo apt-get install libssl1.0-dev

【讨论】:

  • 在 Ubuntu 16.04 上出现以下错误:E: Package 'libssl1.0-dev' has no installation Candidate
  • @KoviNET:我也遇到同样的错误。如果您已经解决了,请您分享一下您是如何解决的
【解决方案3】:

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 做同样的事情,但这对我来说已经足够了。此解决方案可防止您更改整个系统的符号链接。

【讨论】:

    【解决方案4】:

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

    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 with value 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】:

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

      sudo apt-add-repository -y ppa:rael-gc/rvm
      sudo apt-get update
      sudo apt-get install libssl1.0-dev 
      

      【讨论】:

      • 谢谢!这是从他们的存档中安装旧版本的 Qt 所必需的:download.qt.io/new_archive/qt on Ubuntu 20.04.3 LTS。我需要获得 Qt 5.5.1 并且 .run 文件不会运行,直到我安装了这个版本的 libssl1.0-dev
      【解决方案6】:

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

      sudo apt install libssl1.0-dev
      

      【讨论】:

        【解决方案7】:

        您必须将 /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

        【讨论】:

        • 据我所知,不建议更改 /usr/lib 中的符号链接。首先,将对您的整个系统进行更改(并且某些其他组件肯定依赖于 libssl1.0.2 并且不支持 1.1),并且在更新时会自动隐藏更改(例如对 libssl1.0.3 的安全更新) .
        • 是的,但直到今天你还有更多选择
        • 我不同意。我的回答中至少描述了 4 个选项。这并不详尽。
        • 较新的 lib 有很多已删除/弃用的函数,因此链接到它不会解决任何问题,因为在启动应用程序时,仍然找不到这些函数!
        猜你喜欢
        • 2021-11-17
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        • 2020-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多