C++ Qt错误消息";qt.network.ssl:QSslSocket::connectToHostEncrypted:TLS初始化失败“;

C++ Qt错误消息";qt.network.ssl:QSslSocket::connectToHostEncrypted:TLS初始化失败“;,c++,qt,ssl,openssl,C++,Qt,Ssl,Openssl,尝试运行Qt应用程序时出现以下错误: qt.network.ssl:QSslSocket::connectToHostEncrypted:TLS初始化失败 qt.network.ssl:QSslSocket::connectToHostEncrypted:TLS初始化失败 错误:“TLS初始化失败” 我的应用程序非常基本,如下所示: #include "widget.h" #include "ui_widget.h" #include <QNetworkReply> #includ

尝试运行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));
    }
}

#包括“widget.h”
#包括“ui_widget.h”
#包括
#包括
小部件::小部件(QWidget*父部件)
:QWidget(父项)
,ui(新ui::小部件)
{
用户界面->设置用户界面(此);
netManager=新的QNetworkAccessManager(此);
netReply=nullptr;
mDataBuffer=新的QByteArray();
//定义网络请求
QNetworkRequest请求;
request.setUrl(QUrl(“https://www.qt.io"));
netReply=netManager->get(请求);
连接(netReply,&QIODevice::readyRead,this,&Widget::dataReadyToRead);
连接(netReply,&QNetworkReply::finished,this,&Widget::dataReadFinished);
}
小部件::~Widget()
{
删除用户界面;
}
void小部件::dataReadyToRead()
{
qDebug()附加(netReply->readAll());
}
void小部件::dataReadFinished()
{
如果(netReply->error())
{
qDebug()text编辑->设置明文(QString(*mDataBuffer));
}
}
所以我搜索了stack overflow并找到了一些答案(似乎出现错误是因为找不到openSSl库),但仍然不起作用。
以下是我到目前为止所做的:

  • 我已在此网站上下载了Windows 64位(Win64 OpenSSL v1.1.1d)的OpenSSL:
  • 我已经安装了OpenSSL (-尝试设置环境变量,但未能正确设置)
  • 在运行openSSL时尝试运行我的应用程序
我错过什么了吗

编辑:

谢谢你的答复:

以下是从qDebugs获得的信息:

  • QSslSocket::sslLibraryBuildVersionString()返回:“OpenSSL 1.0.2p 2018年8月14日”

  • QSslSocket::supportsSsl()返回:false

  • 返回的QSslSocket::sslLibraryVersionString()为空字符串

下面是我在1.0.2版本中获取并安装OpenSSL(另一个版本是unistall),将install folder添加到路径变量中(它只是C:\OpenSSL-Win64,也尝试了C:\OpenSSL-Win64\bin这两个文件包含dll)

不幸的是,我仍然有同样的问题

安装文件夹内容:

  • 垃圾箱
  • 经验
  • 包括
  • 解放党
  • changes.txt
  • 常见问题解答.txt
  • libeay32.dll
  • libssl.dll
  • license.txt
  • news.txt
  • 自述文件
  • ssleay32.dll
  • unins000.dat
  • unins000.exe
在阅读了Qt文档之后,我尝试做了一些事情:

  • 我复制/粘贴C:\Windows\System32中的目录OpenSSL-Win64(根据文档,OpenSSL库首先在该目录中查找)->不起作用
  • 我已经创建了一个PATH环境变量,并给它一个openSSL安装文件夹的值(现在我使用默认创建的“PATH”环境变量,它覆盖了默认值,但我已经设法恢复了它)->不起作用

根据问题提供的信息,您似乎安装了一个更新的OpenSSL版本。事实上,我已经有了

正如您所发现的,Qt并没有嵌入OpenSSL。你要做的是自己安装。但是您应该确保您的OpenSSL版本与用于Qt构建的版本相同(或最接近)

  • 您可以通过以下方式检查Qt构建使用的OpenSSL版本:
qDebug()以下是解决方案(对我有效):

  • 使用qDebug检查Qt构建使用了哪个版本的OpenSSL(请参见Fareanor的回答)
  • 下载适用于Windows 64位的OpenSSl的封闭版本,因为它是我的操作系统
  • 执行下载的安装程序并选中“将OpenSSL DLL复制到:Windows系统目录”复选框

答案肯定有效,但您必须找到与您的Qt应用程序所需的OpenSSL库几乎完全匹配的答案

这可能并不容易。出于各种原因,这个家伙似乎特别坚持不支持老版本的OpenSSL

我明白了;这确实有道理,但在我们的例子中,它是一个服务器端组件,它“获取”了一个众所周知的公共https位置,只有一个URL。(API)。IMHO说,旧版本没有真正的漏洞,但我意识到这肯定不是每个应用都有

我的解决方案是在VisualStudio调试器中打开应用程序。(任何显示按需加载DLL的调试器都可以工作)。然后我点击“跑”

我发现我们最近编译的应用程序从“在家折叠”加载了OpenSSL,尽管我已经在测试箱上加载了每个版本的OpenSSL(并验证了路径位置)。不会跑的

在我的开发盒上,我从未加载过OpenSSL,但代码运行良好

我添加了@Fareano建议的一行代码(也请投票支持他的答案!):

你的可能会有所不同

FAH客户端版本为1.0.2o,或DLL模块版本:1.0.2.15。网站上最早的版本是:1.0.2.21,即使直接放置在运行位置(总是在路径位置之前进行检查),也不会加载

当我将OpenSSL文件从家里的折叠复制到我的开发盒中的Prod盒时,OpenSSL突然开始在我们的代码中工作

我们还需要这些文件: libgcc_s_dw2-1.dll libgcc_s_dw2-1.dll libwinpthread-1.dll zlib1.dll

这些都没有记录在案

我们的代码基于一个开源项目,该项目将Qt库构建捆绑在一个单独的“SDK”目录中。我发现cmake脚本不会在VC 2019上运行,甚至不会在VC 2017的补丁版本上运行,所以我们对美国的
qDebug() << QSslSocket::sslLibraryBuildVersionString();
qDebug() << QSslSocket::supportsSsl();
qDebug() << QSslSocket::sslLibraryVersionString();
qDebug() << QSslSocket::sslLibraryVersionString();
C:\Program Files (x86)\FAHClient\SSLEAY32.dll
    == John ==