C++ Qt错误消息";qt.network.ssl:QSslSocket::connectToHostEncrypted:TLS初始化失败“;
尝试运行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.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时尝试运行我的应用程序
- QSslSocket::sslLibraryBuildVersionString()返回:“OpenSSL 1.0.2p 2018年8月14日”
- QSslSocket::supportsSsl()返回:false
- 返回的QSslSocket::sslLibraryVersionString()为空字符串
- 垃圾箱
- 经验
- 包括
- 解放党
- changes.txt
- 常见问题解答.txt
- libeay32.dll
- libssl.dll
- license.txt
- news.txt
- 自述文件
- ssleay32.dll
- unins000.dat
- unins000.exe
- 我复制/粘贴C:\Windows\System32中的目录OpenSSL-Win64(根据文档,OpenSSL库首先在该目录中查找)->不起作用
- 我已经创建了一个PATH环境变量,并给它一个openSSL安装文件夹的值(现在我使用默认创建的“PATH”环境变量,它覆盖了默认值,但我已经设法恢复了它)->不起作用
- 您可以通过以下方式检查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 ==