GET 请求上的 TLS 初始化失败

新手上路,请多包涵

我从 qt/c++ 开始,在我的项目中我需要做一个 json post/get/put 但我正在尝试做一个简单的 get 请求但我有一个错误: qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed

我不知道为什么,我尝试了一些方法,但都发出了相同的信息。我附上了我使用的代码。

主窗口.cpp:

 void MainWindow::replyFini(QNetworkReply* reply)
{
    QString answer = QString::fromUtf8(reply->readAll());
    qDebug() << "answer------------>"<<answer;
}

void MainWindow::on_btn_login_clicked()
{
    QNetworkRequest request(QUrl("https://httpbin.org/get"));
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFini(QNetworkReply*)));
    manager->get(request);
}

主窗口.h:

 #include <QtCore>
#include <QNetworkAccessManager>
#include <QNetworkReply>

原文由 ikan nedes 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 560
2 个回答

未找到 SSL 库。可以在 Qt Src 中读出错误。将它们与您的应用程序一起部署或在您的计算机上安装 OpenSSL。

另外,只是一个小提示:

 void MainWindow::replyFini(QNetworkReply* reply)
{
    QString answer = QString::fromUtf8(reply->readAll());
    qDebug() << "answer------------>"<<answer;
}

你应该打电话 reply->deleteLater();

 void MainWindow::on_btn_login_clicked()
{
    QNetworkRequest request(QUrl("https://httpbin.org/get"));
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFini(QNetworkReply*)));
    manager->get(request);
}

添加 connect(manager, &QNetworkAccessManager::finished, manager, &QNetworkAccessManager::deleteLater); 以避免每次点击时内存泄漏。

原文由 user3606329 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 Windows 上,如果您通过在线安装程序安装 Qt,您可以选择 OpenSSL Toolkit 作为可选组件。这应该为您提供与您的 Qt 绝对兼容的版本。

如果安装时没有勾选,可以重新运行 C:\Qt\MaintenanceTool.exe ,选择Add or remove components。 OpenSSL Toolkit 位于 Developer and Designer Tools 部分下,它是最后一个条目。

但是,边栏中有一条注释:

Qt 安装程序没有设置 OpenSSL 环境。用户需要定义路径和环境变量。

因此一旦安装,您应该将包含 DLL 的目录添加到 PATH 环境变量中,或者将所需的 DLL 放在 .exe 文件附近(将它们复制到 debugrelease 你的项目的目录)。

该目录位于 C:\Qt\Tools\OpenSSL\Win_x64\bin (或 Win_x86 如果您需要 32 位版本)。在我的例子中,DLL 被命名为 libssl-1_1-x64.dlllibcrypto-1_1-x64.dll


但这还不足以将其部署到另一台机器上,在复制完所有内容后我再次遇到相同的错误。原因是 OpenSSL DLL 依赖于另一个 MSVC 运行时版本而不是 Qt 应用程序本身,并且这些错误未报告。在 Dependency Walker 中打开这些 DLL 以找出缺少的内容。就我而言,它是 MSVCR100.dll ,所以我必须安装 MSVC 2010 Redistributable x64x86 在这里)。

原文由 user 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题