在使用 Qt 的网络模块时,通常情况下通过 HTTP 请求都不会有问题。但是,当需要通过 HTTPS 进行加密传输时,就必须使用 OpenSSL 库。这是因为 HTTPS 需要通过 SSL/TLS 进行加密,如果系统中缺少相应的库,就会导致出现类似"qt.network.ssl:QSslSocket::connectToHostEncrypted: TLS initialization failed" 的错误。
如果在新的设备上编译原来的项目,很大概率出现这个问题,因为这时候qt没有配置相应的open ssl .dll文件(windows系统)。
在 Linux 或 macOS 环境下,系统通常会默认包含 OpenSSL 或类似的加密库,因此在这些平台上配置 SSL/TLS 支持会更加简便。Windows 系统则通常需要手动安装并配置 OpenSSL 才能确保 Qt 项目中的 HTTPS 请求正常工作。
本文的解决方案仅适用于 Windows 系统。
步骤一:下载 OpenSSL
首先,你需要下载 OpenSSL。可以通过以下链接访问下载页面:
进入页面后,你会看到左侧栏中列出了不同的 OpenSSL 版本。你需要根据自己的系统选择合适的版本和格式进行下载。不要盲目选择高版本,一定要根据你的 Qt 版本来选择对应的 OpenSSL 版本。
如何确定你需要的 OpenSSL 版本?
你可以在 Qt 项目中使用 QSslSocket::sslLibraryBuildVersionString()
函数,输出当前 Qt 支持的 OpenSSL 版本。例如,输出结果可能是 OpenSSL 1.1.1
,这说明你需要下载对应版本的 OpenSSL。然后,根据你系统的位数(32位或64位)来选择相应的安装包。
如果你喜欢动手,也可以选择下载 OpenSSL 源码自行编译,但相较之下,直接下载并安装已经编译好的版本显然更加方便。
当正确配置了之后,在 Qt 项目中使用QSslSocket::supportsSsl();结果为true。
步骤二:拷贝库文件
安装完成 OpenSSL 后,进入安装路径下的 bin
目录,找到两个库文件,并将它们拷贝到你的应用程序执行路径下。例如,拷贝到 Qt 编译路径(例如 msvc2017/bin/
)。这样,所有使用该编译器的 Qt 工程都可以支持 SSL/TLS 功能。
库文件名称可能根据版本有所不同,常见的两个文件为:
libcrypto-1_1.dll
libssl-1_1.dll
如果是64位的则为:
步骤三:重新编译并测试
完成库文件的拷贝后,重新编译你的 Qt 项目,并运行程序。此时,HTTPS 请求应该可以正常工作了。如果问题依然存在,可以尝试使用调试工具跟踪并检查具体的错误信息。
总结
配置 Qt 项目中的 HTTPS 支持并不是特别复杂,但确实需要注意版本匹配问题。通过正确安装 OpenSSL 库并将其拷贝到应用程序的执行路径中,你就可以顺利解决 "TLS initialization failed" 的问题。希望本篇文章能够帮你顺利解决这个问题,避免走不必要的弯路。