我在运行 Debian Bullseye Linux 发行版的 Intel x86_64 CPU 架构平台上。在该平台上运行自定义应用程序。该应用程序是一个作为 systemd 服务运行的 32 位软件,具有许多依赖项,其中一些是来自 Qt5 v5.15.2 的库(例如 libqt5network5 模块)和 openssl1.1。在新版本的 openssl 和 Qt5 上,不推荐使用 SSLv3 协议。但是,自定义应用程序仅支持 SSLv3 协议进行网络通信。我在 openssl1.1 中重新添加了 SSLv3 支持,每当我尝试使用以下命令时:
# openssl s_client -connect <my-ip>:<my-port>
我在自定义应用程序日志日志中收到警告:
QSslSocket::startServerEncryption Attempted to use an unsupported protocol
我现在的目标是在 libqt5network 模块中重新添加对 SSLv3 协议的支持,以便消除该警告并建立正确的连接。此外,我需要 32 位架构中的 libqt5network5 模块才能与自定义应用程序兼容。
到目前为止我已经完成的步骤是:
我已经下载了 Qt5 源代码,我尝试恢复提交(OpenSSL:放弃对 SSLv2 和 SSLv3 的支持,提交哈希 ID:455951f59074d6457fd2d10720ac3cbdaa966076。)经过几个小时的编译和 makefile 错误斗争,我成功构建了 Qt5 库。我创建了 Qt5 的 .deb 包并将其安装在平台的根文件系统中但是,我不断收到警告,好像什么都没有改变一样。我可能没有正确恢复提交,或者可能还有更多事情要做。我尝试进一步修改源代码,但这使我陷入更多编译错误。
我的问题是我应该在 Qt5 源代码中更改什么才能实现我的目标?我已经为这个问题绞尽脑汁三个星期了,但找不到解决方案。
PS:抱歉,如果我的问题中有任何混乱或缺乏信息。我已准备好向您提供所有必要的信息。 PS-2:我知道出于安全原因,SSLv3 已被弃用,但这是一项要求,我无法更改它。
感谢您的时间。
答案1
序言(你已经知道了)
更简单的解决方案,也是唯一的解决方案安全的解决方案,在我看来,只是在仍然依赖 SSLv3 的一侧使用现代版本的 TLS;这应该不难。这些库的 API 并没有真正改变,它们现在只是支持比 SSL3 更现代的 TLS。 SSL3 已于 12 年(!)前被弃用,2014 年发现了一个相对微不足道的攻击 (POODLE),并发现了几个易于使用的工具来利用该攻击。
因此,如果您现在使用 SSL3 而没有 POODLE 缓解措施,那么您确实不能称您的通信是加密的。它们的混淆程度很弱,只需要互联网连接即可解密您的消息。
捂住屁股
我理解这是一项要求,但作为一名负责任的软件开发人员,你应该清楚地从你的老板或客户那里得到书面签字,上面写着“是的,这是不安全的,我们仍然希望克里斯花时间和金钱。他指出了漏洞”,只是为了保持你一旦出现问题,就可以脱离火线。
我建议运行该不安全服务的团队遇到在同一台计算机上设置 TLS 代理的问题,以便 SSL3 流量永远不会离开该计算机;只需将相同的数据放入现代 TLS1.3 数据包中,即可同时解决安全性和软件工程问题。 (当然,再次强调,正确的做法是修复该死的应用程序,而不是解决它,但我了解遗留软件的工作原理。)
怎么做
话虽如此,您需要实际替换您的程序正在使用的 Qt5 库,这意味着您不能只安装一些Qt5 版本并希望 a) 事情不会中断 b) 新版本实际上取代了您一直在使用的版本。
因此,您不必手动构建 Qt5 源代码,需要依靠 debian 机制来构建兼容的 Qt5 包,并应用补丁(我再一次不厌其烦地说,这是一个坏主意)。
因此,请执行以下步骤:
预先,卸载您手动构建的内容。否则会引起问题。
- 安装debian开发工具:
sudo apt-get install build-essential fakeroot devscripts
- 找出哪个 debian 软件包包含您要修改的库。
- 去https://packages.debian.org,然后在适合您的 debian 版本的版本中找到它
- 在包信息页面的右侧,您将找到源包的 .dsc 文件的链接(该文件我猜这里是 qtbase-opensource-src,所以链接是这
- 复制该链接;
- 在你的 debian 开发机器上,创建一个新目录并
cd
进入其中 dget THE_LINK_YOU_JUST_COPIED
- 确保安装所有构建依赖项:
mk-build-deps; sudo apt-get install ./*build-deps*.deb
- 进入其子文件夹中提取的源代码,
cd debian
- 通过应用所有已有的补丁进行准备:
quilt push -a
- 开始一个新的补丁:
quilt new enable_ssl_v3_verybadidea
- 因为您知道要更改哪些文件:
quilt add file1 file2 file3 …
- 之后,编辑文件
- 提交对补丁的更改
quilt refresh
- 现在返回到 debian 解压缩的顶级目录,并进行构建:
debuild -b -uc -us
- 在您在 5. 中创建的目录中,现在有经过您修改的新 qt5 debian 软件包,您可以直接安装它们,然后替换 qt5 软件包。
sudo apt-get install ../*.deb
安装这些!
为什么这么复杂?
好吧,我们都同意构建 Qt5 很复杂。 Debian 已经找到了如何为您做到这一点,所以我们应该使用他们的脚本。另外,我们需要完全像 debian 一样构建,因为我们需要该库与 debian 兼容 - 否则,您将损坏依赖 qt5 的其他 debian 软件包的功能。
所以,我们必须以 Debian 的方式做事。优点是我们可以获得 .deb 包,我们可以将其复制到我们想要部署应用程序的任何计算机上,并使用单个dpkg -i package.deb
或apt-get install ./package.deb
命令安装它们。
当更改文件以使它们执行我们想要的操作时,我们必须提取一个补丁,然后将 debian 构建过程应用到“新”源,以确保构建确实可靠。
您还必须
- 固定已安装的软件包,以便来自 debian 的可能修复其他错误的更新不会覆盖您的文件(无论您如何安装,这都是事实)
- 将您的补丁转发(从解压源中的 debian/patches 复制补丁文件,并将其添加到 debian/patches/series)到您手动构建的任何更新。
总而言之,您现在的要求使您成为系统 Qt5 的实际维护者,完全不管你如何构建你的 Qt5。如果这不是管理层考虑寻找其他解决方案而不是损害用户系统安全的有力论据,那么我不知道,这可能是我在下一次薪资谈判中考虑的内容,因为其他公司不会强迫你要做到这一点。