Qt错误消息“qt.network.ssl:QSslSocket::连接到主机已加密:TLS初始化失败”

atmip9wb  于 2023-03-03  发布在  .NET
关注(0)|答案(4)|浏览(170)

当我尝试运行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'环境变量,它覆盖了默认值,但我已经设法恢复它)-〉没有工作
czq61nw1

czq61nw11#

根据问题中提供的信息,看起来您安装的OpenSSL版本太新了。实际上我已经有了same issue
正如你所发现的,Qt没有嵌入OpenSSL。你需要做的是自己安装它。但是你应该**确保你拥有的OpenSSL版本与Qt版本所使用的版本相同(或最接近)。

  • 您可以使用以下命令检查Qt构建使用的OpenSSL版本:
qDebug() << QSslSocket::sslLibraryBuildVersionString();
  • 您可以检查SSL是否支持:
qDebug() << QSslSocket::supportsSsl();
  • 您可以使用检查您的版本:
qDebug() << QSslSocket::sslLibraryVersionString();

**注意:**不要忘记将安装目录包含到PATH环境变量中,以使 * dll * 可访问(或复制 * dll *)。

  • 如果它不能解决您的问题,请告诉我,以便我删除此答案,避免不必要的噪音。*
tzdcorbm

tzdcorbm2#

答案肯定有效,但您必须找到Qt应用程序所需的OpenSSL库的几乎完全匹配项。
这可能并不容易,出于各种原因,https://slproweb.com/products/Win32OpenSSL.html的家伙似乎特别坚决不支持旧版本的OpenSSL。
我明白了这确实有道理,但在我们的例子中,它是一个服务器端组件,它“获取”一个众所周知的公共https位置,只有一个URL。(API)。IMHO,旧版本没有真正的漏洞,但我意识到这肯定不是对每个应用程序都是如此。
我的修复方法是在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突然开始在我们的代码中工作。
我们还需要这些文件:软件库文件2 - 1. dll软件库文件2 - 1. dll软件库文件线程-1. dll软件库文件1. dll
这些都没有记录在案
我们的代码基于一个开源项目,该项目将Qt库构建捆绑在一个单独的“SDK”目录中。我发现cmake脚本无法在VC 2019中运行,甚至无法在VC 2017的补丁版本中运行,因此我们一直不愿升级其中的QT。
如果你“做了正确的事情”,下载Qt并从他们的源代码构建,你将能够在你的应用程序中捆绑一个更新的OpenSSL。我只是希望Qt方面的文档稍微好一点。公平地说,如果你做一些挖掘,他们确实提到你需要OpenSSL,但这并不明显。
如果您试图运行一个应用程序,但没有或无法升级到更新的源,此方法至少会告诉您应用程序从哪里获得OpenSSL。

== John ==
i34xakig

i34xakig3#

以下是解决方案(对我有效):

  • 使用qDebug检查Qt构建使用的OpenSSL版本(参见Fareanor答案)。
  • 下载一个接近版本的OpenSSl的Windows 64位,因为它是我的操作系统。
  • 执行下载的安装程序并选中“将OpenSSL DLL复制到:Windows系统目录“复选框
pjngdqdw

pjngdqdw4#

  • 转到:Qt5.12.2\Tools\mingw730_64\opt\bin目录ssleay_x64.dll libeay_x64.dll将这些库复制到程序目录。*

这对我很有效。我复制了指定的文件_x64版本并最终工作。复制其他文件对我不起作用。

相关问题