GET 请求时 TLS 初始化失败

问题描述 投票:0回答:4

我从 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>
c++ json qt
4个回答
38
投票

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

如果安装时没有勾选,可以重新运行

C:\Qt\MaintenanceTool.exe
并选择添加或删除组件。 OpenSSL Toolkit 位于 Developer and Designer Tools 部分下,它是最后一个条目。

但是,侧边栏中有一个注释:

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

因此,一旦安装,您应该将包含 DLL 的目录添加到 PATH 环境变量中,或者将所需的 DLL 放置在

.exe
文件附近(将它们复制到项目的
debug
release
目录中)。

该目录位于

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


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

MSVCR100.dll
,所以我必须安装 MSVC 2010 Redistributable x64x86 在这里)。


9
投票

未找到 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);
以避免每次点击时出现内存泄漏。


4
投票

对我有用的是从 https://slproweb.com/products/Win32OpenSSL.html 下载 OpenSSL 轻型版本(适用于我的编译器)并将 libcrypto 和 libssl DLL 从 c:\Program Files\OpenSSL\ 复制到我的程序的 .exe 文件夹。


3
投票

我在尝试将 arcGIS 地理制图系统集成到 Qt Creator 中时遇到了同样的问题,并且只有在了解到不同版本的 Qt 需要不同版本的 openSSL 后才能解决该问题。我正在使用 Qt Creator 5.15.2 并遇到错误,因为我安装了最新版本的 openSSL。使用这行代码

qDebug() << QSslSocket::supportsSsl() << QSslSocket::sslLibraryBuildVersionString() << QSslSocket::sslLibraryVersionString();

我能够识别 openSSL Qt 正在寻找的版本(不要忘记

#include <QSslSocket>
才能正常工作)。一旦我安装了正确的版本(1.1.1q),一切就完美了。

Here 是下载 openSSL 不同版本的链接。还需要使用 qt 维护工具 -> 开发者工具 -> openSSL 添加所需的内置包装器。

最后一个检查您的计算机(至少在 Windows 上)上当前存在 openSSL 版本(如果有)的好方法是在命令提示符中键入此命令。

$ openSSL version

这应该会导致您的操作系统正在运行当前版本的 openSSL,或者会通知您该命令无法识别。

© www.soinside.com 2019 - 2024. All rights reserved.