尝试运行Qt应用程序时出现以下错误:
qt.network.ssl:QSslSocket :: connectToHostEncrypted:TLS初始化失败
qt.network.ssl:QSslSocket :: connectToHostEncrypted:TLS初始化失败
错误:“ TLS初始化失败”
我的应用程序真的很基础,这是它的外观:
#include "widget.h"
#include "ui_widget.h"
#include <QNetworkReply>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
netManager = new QNetworkAccessManager(this);
netReply = nullptr;
mDataBuffer = new QByteArray();
//Define network request
QNetworkRequest request;
request.setUrl(QUrl("https://www.qt.io"));
netReply = netManager->get(request);
connect(netReply,&QIODevice::readyRead,this,&Widget::dataReadyToRead);
connect(netReply,&QNetworkReply::finished,this,&Widget::dataReadFinished);
}
Widget::~Widget()
{
delete ui;
}
void Widget::dataReadyToRead()
{
qDebug() << "Datas available to read";
mDataBuffer->append(netReply->readAll());
}
void Widget::dataReadFinished()
{
if(netReply->error())
{
qDebug() << "Error: " << netReply->errorString();
}
else
{
ui->textEdit->setPlainText(QString(*mDataBuffer));
}
}
所以我搜索了堆栈溢出并找到了一些答案(似乎由于未找到openSSl库,所以发生了错误),但是它仍然不起作用。
所以这是我到目前为止所做的:
我错过了什么吗?
编辑:
感谢您的答复:
这是从qDebug中得到的东西:
QSslSocket :: sslLibraryBuildVersionString()返回:“ OpenSSL 1.0.2p 2018年8月14日”
QSslSocket :: supportsSsl()返回:false
QSslSocket :: sslLibraryVersionString()返回:空字符串
所以这里是我抓取并安装了1.0.2版本的OpenSSL(完全取消安装另一个版本),将安装文件夹添加到PATH变量中(简单地为C:\ OpenSSL-Win64,也尝试了C:\ OpenSSL-Win64 \ bin这两个文件都包含dll)
不幸的是,我仍然遇到同样的问题。
安装文件夹内容:
现在,我在阅读Qt文档后尝试做一些事情: https://doc.qt.io/qt-5/windows-requirements.html
答案 0 :(得分:0)
根据问题提供的信息,您似乎已安装了最新的OpenSSL版本。实际上我已经有了same issue。
您已经发现,Qt没有嵌入OpenSSL。您要做的就是自己安装。但是,您应该确保与用于Qt构建的版本具有相同(或最接近)的OpenSSL版本。
qDebug() << QSslSocket::sslLibraryBuildVersionString();
qDebug() << QSslSocket::supportsSsl();
qDebug() << QSslSocket::sslLibraryVersionString();
注意:不要忘记将安装目录包括在PATH环境变量中,以使 dll 可以访问(或复制 dll )。
让我知道它是否不能解决您的问题,以便我删除此答案以避免不必要的干扰。
答案 1 :(得分:0)
以下是解决方案(对我有用):
答案 2 :(得分:0)
答案肯定有效,但是您必须找到Qt应用所需的OpenSSL库的几乎完全匹配。
这可能并不容易。由于各种原因,https://slproweb.com/products/Win32OpenSSL.html的那个人似乎特别坚决不支持旧版本的OpenSSL。
我明白了;它确实有道理,但是在我们的案例中,它是服务器端组件,它对知名的公共https位置执行了“获取”操作,仅一个URL。 (一个API)。恕我直言,较早的版本没有真正的漏洞,但是我意识到这并不是每个应用程序都正确。
我的解决办法是在Visual Studio调试器中打开该应用程序。 (任何显示需求加载DLL的调试器都可以工作)。然后点击“运行”。
我发现,尽管我已经在测试中加载了每个版本的OpenSSL(并验证了路径位置),但我们最近编译的应用程序还是从“在家折叠”中加载了OpenSSL。框。无法运行。
在开发人员框中,我从未加载过OpenSSL,但是代码运行正常。
我添加了@Fareanor建议的代码行(也支持他的回答!):
qDebug() << QSslSocket::sslLibraryVersionString();
我们的代码说:需要OpenSSL版本:“ OpenSSL 1.0.2p 2018年8月14日”
我们在开发人员框中的代码是按需加载:
C:\Program Files (x86)\FAHClient\SSLEAY32.dll
您的情况可能会有所不同。
FAH客户端的版本为1.0.2o,或DLL模块的版本为:1.0.2.15。该网站最早的版本是:1.0.2.21,即使直接放置在运行位置(始终在PATH位置之前检查),也不会加载。
一旦我将OpenSSL文件从Folding at Home复制到我的Dev框的Prod框中,突然OpenSSL就开始在我们的代码中工作了。
我们还需要以下文件: libgcc_s_dw2-1.dll libgcc_s_dw2-1.dll libwinpthread-1.dll zlib1.dll
而那些没有记录
我们的代码基于一个开源项目,该项目将Qt库构建捆绑在一个单独的“ SDK”目录中。我发现cmake脚本无法在VC 2019或VC 2017的补丁版本中运行,因此我们非常不愿意在其中升级QT。
希望,如果您“做正确的事”并下载Qt并从其来源进行构建,则可以将较新的OpenSSL与您的应用捆绑在一起。我只是希望在Qt方面可以更好地进行记录。公平地说,如果您进行一些挖掘,他们确实会提到您需要OpenSSL,但这并不明显。
如果您尝试使某个应用运行,而又没有运行或无法升级到较新的源,则此方法至少会告诉您该应用从何处获取OpenSSL。
== John ==