Qt中使用OpenSSL
概述
OpenSSL官网
- OpenSSL官网:OpenSSL是一个开源跨平台的加密库,应用广泛。Windows提供了自己的一套加密认证API,感兴趣的话可以参考:Windows Authentication Overview。
Qt官方文档:
网站内容为英文,阅读起来需要一些耐心。其中比较重要的信息有两点:
- Qt使用了OpenSSL,但是因为地区法律规定的原因,在Qt安装包里面并没有包含OpenSSL,需要用的话,在遵守法律的前提下,自己编译安装,并对你的软件合法分发。
这里说的“法律”,OpenSSL官网在首页最下方对其进行了描述(来自必应翻译):
请记住,在世界某些地区,进出口和/或使用强大的加密软件、提供加密钩,甚至只是传达有关加密软件的技术细节都是非法的。因此,当您将此包导入您的国家/地区时,请重新分发,甚至只是通过电子邮件向作者或其他人发送技术建议,甚至提供补丁,因此强烈建议您密切关注适用于您的任何法律或法规。OpenSSL 的作者对您在此处做出的任何违规行为不承担责任。所以要小心,这是你的责任。
- 默认情况下,Qt在运行时动态加载OpenSSL,也就是说,如果能找到对应版本的OpenSSL库,相关模块就支持SSL通信,否则就不支持。
Qt中哪些地方用到了OpenSSL
https
所属模块:QT += network
使用QNetworkAccessManager进行https访问时,需要使用OpenSSL,通过以下代码可以打印出QNetworkAccessManager当前可用的协议。
QNetworkAccessManager *manager = new QNetworkAccessManager(this); qDebug() << manager->supportedSchemes();
如果输出中没有"https",说明OpenSSL未配置,配置方法见下文。
Qt SSL Classes
所属模块:QT += network
Qt的SSL系列类使用OpenSSL实现,所以依赖OpenSSL库。可以使用以下代码打印查看当前版本的Qt依赖哪个版本的OpenSSL:
qDebug() << QSslSocket::sslLibraryBuildVersionString();
自己下载安装OpenSSL
下载安装有两种方式:
-
通过源码编译,直接在官网下载源码编译即可,优点是安全,全版本都有,缺点是费事。具体步骤参考:
QT支持https及编译OpenSSL。 -
使用第三方编译好的安装包:优点是省事,缺点是无法确定发布者是否可靠、版本不全。具体步骤参考:Qt连接https :解决OpenSSL问题。
关于libeay32.dll和ssleay32.dll
可能读者在搜索资料的过程中,发现有的地方说要拷贝libeay32.dll和ssleay32.dll,有的地方说要拷贝libssl-1_1.dll和libcrypto-1_1.dll。到底需要哪个?还是两者都要?
答案在OpenSSL git仓库日志中,找到分支OpenSSL-1_1_0-stable,查看日志,在以下提交中有对应的描述:
SHA-1: 6928b6171ada6d0de5a024a188dc7a68094d2dca * Change names of ordinals and libs, libeay => libcrypto and ssleay => libssl Reviewed-by: Rich Salz <rsalz@openssl.org>
也就是说,
- libeay32.dll和ssleay32.dll是OpenSSL v1.1.0之前版本才有的库。
- 从OpenSSL v1.1.0开始,libeay32.dll=>libcrypto,ssleay32.dll=>libssl。
关于SSL漏洞
旧版本的OpenSSL库存在漏洞,如“心脏滴血”漏洞,详细描述见OpenSSL漏洞列表。所以要尽量使用已知安全的、稳定的OpenSSL版本。对于Qt来说,也要使用新的Qt版本。
但是,如果在Qt版本确定的情况下,此版本的Qt使用的OpenSSL版本也是确定的。如果此版本的OpenSSL存在漏洞怎么办?
1. 使用此分支的稳定版本
以Qt5.5.1 msvc2013 32位为例,其依赖的OpenSSL版本为:OpenSSL 1.0.2g 1 Mar 2016。在 OpenSSL官网更新日志 中可以找到此版本的更新描述。
接着,在 OpenSSL的Git仓库 中,将其克隆到本地后查看版本分支图,可以看到OpenSSL 1.0.2g所在分支为OpenSSL_1_0_2-stable,此分支最新版本为OpenSSL 1.0.2u。因为它们属于同一个大版本,所以可以使用此版本的OpenSSL尝试,这里仅提供一个思路,笔者目前未尝试。
再以Qt 5.12.11为例,此版本使用的OpenSSL版本为OpenSSL 1.1.1g 21 Apr 2020。直接安装使用最新的OpenSSL v1.1.1l能够正常运行。
2. 更换版本分支
截至目前,根据官网描述,v1.1.1以前的版本将不做更新,也就是说,v1.1.1之前的版本就算有重大Bug也不会修复了(除非付费支持)。在这种情况下,只有更换新的OpenSSL分支了。更换OpenSSL分支一般需要更换Qt版本。
3. 使用第三方SSL通信库
可能因为某种原因,项目中无法更换Qt版本。解决此问题是方法是,使用第三方网络通信库,如:
- libcurl:libcurl on github地址,libcurl可以基于较新的OpenSSL编译,从而实现https访问。如需要实现SSL Socket,可以查找第三方库或自己实现。
结语
至此我们对Qt中使用OpenSSL有了初步的了解,更加深入的内容后续会不断更新,敬请期待。
本文原创首发自微信公众号:Qt未来工程师。
本文来自博客园,作者:撬动未来的支点,转载请注明原文链接:https://www.cnblogs.com/pivotfuture/p/16297340.html
CSDN:撬动未来的支点,公众号:Qt未来工程师,网站:www.qtfuture.cn
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!