当我尝试运行Qt应用程序时,出现以下错误:
qt.network.ssl:QSslSocket::连接到主机已加密:TLS初始化失败
qt.network.ssl:QSslSocket::连接到主机已加密: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库而发生错误),但它仍然不起作用。
这是我目前所做的:
- 我已经下载了OpenSSL的窗口64位(Win64 OpenSSL v1.1.1d)在这个网站上:https://slproweb.com/products/Win32OpenSSL.html
- 我已经安装了OpenSSL(-尝试设置环境变量,但我没有设法正确地做)
- 尝试在运行openSSL时运行我的应用
我错过什么了吗?
编辑:
感谢您的回复:
下面是从qDebugs中获得的内容:
- QSslSocket::sslLibrary构建版本字符串()返回:"OpenSSL 1.0.2p 2018年8月14日"
- QSslSocket::支持返回的Ssl():假的
- QSslSocket::ssl库版本字符串()返回:空字符串
这里是我抓取并安装OpenSSL 1.0.2版本,(卸载另一个),添加到PATH变量安装文件夹(它只是C:\OpenSSL-Win64,也尝试了C:\OpenSSL-Win64\bin这两个文件都包含dll)
不幸的是,我仍然有同样的问题。
安装文件夹内容:
- 箱
- 实验
- 包括
- 利伯
- changes.txt
- faq.txt
- libeay32.dll
- libssl.dll
- license.txt
- news.txt
- readme.txt
- ssleay32.dll
- unins000.dat
- unins000.exe
现在,在阅读了Qt文档之后,我尝试做一些事情:https://doc.qt.io/qt-5/windows-requirements.html
- 我在C:\Windows\System32中复制/粘贴了目录OpenSSL-Win64(根据文档,openSSL库首先在此目录中查找)-〉不起作用
- 我已经创建了一个PATH环境变量,并给它的openSSL安装文件夹的值(现在我已经使用默认创建的'Path'环境变量,它覆盖了默认值,但我已经设法恢复它)-〉没有工作
4条答案
按热度按时间czq61nw11#
根据问题中提供的信息,看起来您安装的OpenSSL版本太新了。实际上我已经有了same issue。
正如你所发现的,Qt没有嵌入OpenSSL。你需要做的是自己安装它。但是你应该**确保你拥有的OpenSSL版本与Qt版本所使用的版本相同(或最接近)。
**注意:**不要忘记将安装目录包含到PATH环境变量中,以使 * dll * 可访问(或复制 * dll *)。
tzdcorbm2#
答案肯定有效,但您必须找到Qt应用程序所需的OpenSSL库的几乎完全匹配项。
这可能并不容易,出于各种原因,https://slproweb.com/products/Win32OpenSSL.html的家伙似乎特别坚决不支持旧版本的OpenSSL。
我明白了这确实有道理,但在我们的例子中,它是一个服务器端组件,它“获取”一个众所周知的公共https位置,只有一个URL。(API)。IMHO,旧版本没有真正的漏洞,但我意识到这肯定不是对每个应用程序都是如此。
我的修复方法是在Visual Studio调试器中打开应用程序。(任何显示按需加载DLL的调试器都可以工作)。然后我点击“运行”。
我发现,我们的应用程序,最近编译的方式,加载OpenSSL从“折叠在家里”,尽管事实上我已经加载了 * 每 * 版本的OpenSSL(并验证路径位置)在我们的测试箱。
在我的开发盒上,我从来没有加载过OpenSSL,但代码运行良好。
我添加了@Fareanor建议的代码行(也支持他的答案!):
我们的准则是:需要的OpenSSL版本:“OpenSSL 1.0.2p 2018年8月14日”
我的开发工具箱上的代码是按需加载的:
你的可能会有所不同。
FAH客户端版本为1.0.2o,或DLL模块版本:1.0.2.15.网站上最早的版本是:1.0.2.21,即使直接放在运行位置(总是在PATH位置之前检查)也不会加载。
一旦我将OpenSSL文件从Folding at Home复制到我的Dev框中的Prod框,OpenSSL突然开始在我们的代码中工作。
我们还需要这些文件:软件库文件2 - 1. dll软件库文件2 - 1. dll软件库文件线程-1. dll软件库文件1. dll
这些都没有记录在案
我们的代码基于一个开源项目,该项目将Qt库构建捆绑在一个单独的“SDK”目录中。我发现cmake脚本无法在VC 2019中运行,甚至无法在VC 2017的补丁版本中运行,因此我们一直不愿升级其中的QT。
如果你“做了正确的事情”,下载Qt并从他们的源代码构建,你将能够在你的应用程序中捆绑一个更新的OpenSSL。我只是希望Qt方面的文档稍微好一点。公平地说,如果你做一些挖掘,他们确实提到你需要OpenSSL,但这并不明显。
如果您试图运行一个应用程序,但没有或无法升级到更新的源,此方法至少会告诉您应用程序从哪里获得OpenSSL。
i34xakig3#
以下是解决方案(对我有效):
pjngdqdw4#
这对我很有效。我复制了指定的文件_x64版本并最终工作。复制其他文件对我不起作用。