Qt错误消息“ qt.network.ssl:QSslSocket :: connectToHostEncrypted:TLS初始化失败”

时间:2019-10-30 12:57:39

标签: 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>

#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库,所以发生了错误),但是它仍然不起作用。
所以这是我到目前为止所做的:

  • 我已经在以下网站上下载了64位窗口的OpenSSL(Win64 OpenSSL v1.1.1d):     https://slproweb.com/products/Win32OpenSSL.html
  • 我已经安装了OpenSSL (-尝试设置环境变量,但是我没有正确地做到这一点)
  • 尝试在运行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)

不幸的是,我仍然遇到同样的问题。

安装文件夹内容:

  • bin
  • exp
  • 包括
  • lib
  • 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

  • 我将目录OpenSSL-Win64复制/粘贴到C:\ Windows \ System32中(根据文档,首先在此目录中查找openSSL库)->无效
  • 我已经创建了一个PATH环境变量,并为其提供了openSSL安装文件夹的值(目前,我使用了默认情况下创建的“ Path”环境变量,它已经覆盖了默认值,但我设法恢复它)->无效

3 个答案:

答案 0 :(得分:0)

根据问题提供的信息,您似乎已安装了最新的OpenSSL版本。实际上我已经有了same issue

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

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

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


让我知道它是否不能解决您的问题,以便我删除此答案以避免不必要的干扰。

答案 1 :(得分:0)

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

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

答案 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 ==