各位,MSVC2019+Qt5.15使用network模块,从githubusercontent.com下载文件提示TLS initialization failed怎么办?
试过把OpenSSL 1.1.1放在bin目录、程序目录都不行。
但MSVC2022+Qt6可以直接编译运行,但是体积有点大,所以还是想用Qt5
MSVC2019+Qt5.15使用network模块,从githubusercontent.com下载文件提示TLS initialization failed怎么办
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
5条回答 默认 最新
檀越@新空间 2025-07-27 20:25关注晚上好🌙🌙🌙
本答案参考通义千问在使用 MSVC2019 + Qt5.15 时,如果你在使用
QNetworkAccessManager下载文件(如从githubusercontent.com)时遇到错误提示:"TLS initialization failed",这通常是因为 Qt5 的网络模块没有正确加载 OpenSSL 库 或者 缺少必要的 DLL 文件。
🔍 问题原因分析
- Qt5 的网络模块依赖 OpenSSL,但在某些情况下(尤其是 MSVC 编译器),默认的 Qt 安装可能不包含完整的 OpenSSL 支持。
- GitHub 使用 HTTPS 协议,因此必须启用 TLS 支持。
- 如果你手动放置了 OpenSSL 的
.dll文件(如libeay32.dll,ssleay32.dll),但程序仍然报错,说明:- 这些 DLL 不是与你的 Qt 版本兼容的版本;
- 或者这些 DLL 没有被正确加载。
✅ 解决方案
1. 确保使用正确的 OpenSSL 版本
推荐使用 OpenSSL 1.1.1,这是 Qt5.15 支持的版本。
步骤:
-
下载 OpenSSL 1.1.1 的 MSVC 静态库或动态库:
- OpenSSL for Windows (Win64)
- 选择 "Win64 OpenSSL v1.1.1w"(根据你的系统选择 32/64 位)
-
安装后,将以下 DLL 文件复制到你的项目可执行文件的目录(例如
your_project.exe所在的文件夹):libeay32.dll ssleay32.dll
注意: 有些版本的 OpenSSL 提供的是
libcrypto-1_1-x64.dll和libssl-1_1-x64.dll,这种情况下你需要将其重命名为libeay32.dll和ssleay32.dll,否则 Qt 可能无法识别。
2. 确保 Qt 项目配置中启用了 SSL 支持
在
.pro文件中添加以下内容以确保 Qt 正确链接 OpenSSL:QT += network CONFIG += openssl如果你使用的是静态编译的 Qt,还需要确认是否在编译 Qt 时启用了 SSL 支持。如果未启用,你需要重新编译 Qt 并启用 OpenSSL。
3. 配置 Qt 的 SSL 插件(可选)
有时候即使有 DLL 文件,Qt 也可能找不到 SSL 插件。你可以手动将 SSL 插件放入
plugins/network目录。步骤:
-
找到 Qt 的 SSL 插件路径,通常是:
<Qt安装路径>/5.15.2/msvc2019_64/plugins/network/ -
将其中的
qsslsocket.dll和相关文件复制到你的可执行文件所在目录的plugins/network/文件夹中。
4. 检查运行时环境变量
确保你的程序运行时,系统可以找到 OpenSSL 的 DLL 文件。你可以通过以下方式验证:
-
在命令行中运行你的程序,查看是否有如下输出:
QNetworkReplyHttpImpl::start: TLS initialization failed -
如果没有看到这个错误,说明 OpenSSL 被正确加载了。
5. 示例代码(确保 SSL 正确初始化)
下面是一个简单的示例,用于测试是否能够下载文件:
#include <QApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> #include <QFile> #include <QDebug> int main(int argc, char *argv[]) { QApplication app(argc, argv); QNetworkAccessManager manager; QUrl url("https://raw.githubusercontent.com/example/repo/file.txt"); QNetworkRequest request(url); QObject::connect(&manager, &QNetworkAccessManager::finished, [&](QNetworkReply *reply) { if (reply->error()) { qDebug() << "Error:" << reply->errorString(); } else { QFile file("downloaded_file.txt"); if (file.open(QIODevice::WriteOnly)) { file.write(reply->readAll()); file.close(); qDebug() << "Download successful."; } } reply->deleteLater(); app.quit(); }); manager.get(request); return app.exec(); }
🧠 总结
| 步骤 | 内容 | |------|------| | 1 | 使用 OpenSSL 1.1.1 的 MSVC 版本,并将 dll 文件放在可执行文件目录下 | | 2 | 在
.pro文件中添加CONFIG += openssl| | 3 | 手动复制 qsslsocket.dll 到 plugins/network 文件夹 | | 4 | 确保运行时环境能找到 OpenSSL 的 dll 文件 | | 5 | 编写测试代码验证 TLS 是否正常工作 |
💡 补充建议
- 如果你不想处理 OpenSSL 的复杂性,可以考虑使用 Qt5.15 的静态构建版本,并确保在编译时启用了 OpenSSL 支持。
- 如果你对性能和体积要求不高,Qt6 是更好的选择,因为它内置了更完善的网络和 SSL 支持。
如果你需要我帮你生成一个完整的 Qt5.15 + MSVC2019 + OpenSSL 的项目模板,也可以告诉我,我可以提供详细配置和代码。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报