C14147 2025-07-27 20:24 采纳率: 50%
浏览 7
已结题

MSVC2019+Qt5.15使用network模块,从githubusercontent.com下载文件提示TLS initialization failed怎么办

各位,MSVC2019+Qt5.15使用network模块,从githubusercontent.com下载文件提示TLS initialization failed怎么办?
试过把OpenSSL 1.1.1放在bin目录、程序目录都不行。
但MSVC2022+Qt6可以直接编译运行,但是体积有点大,所以还是想用Qt5

  • 写回答

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 静态库或动态库:

    • 安装后,将以下 DLL 文件复制到你的项目可执行文件的目录(例如 your_project.exe 所在的文件夹):

      libeay32.dll
      ssleay32.dll
      

    注意: 有些版本的 OpenSSL 提供的是 libcrypto-1_1-x64.dlllibssl-1_1-x64.dll,这种情况下你需要将其重命名为 libeay32.dllssleay32.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 的项目模板,也可以告诉我,我可以提供详细配置和代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 8月5日
  • 已采纳回答 7月28日
  • 创建了问题 7月27日