簡體   English   中英

Qt 錯誤消息“qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS 初始化失敗”

[英]Qt error message “qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed”

嘗試運行 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 庫)但它仍然不起作用。
所以這是我到目前為止所做的:

  • I've downloaded OpenSSL for window 64 bit (Win64 OpenSSL v1.1.1d) on this website: https://slproweb.com/products/Win32OpenSSL.html
  • 我已經安裝了 OpenSSL ( - 嘗試設置環境變量,但我沒有正確地做到這一點)
  • 嘗試在運行 openSSL 時運行我的應用程序

我錯過了什么?

編輯:

謝謝回復:

以下是從 qDebugs 獲得的信息:

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

  • QSslSocket::supportsSsl() 返回:假

  • QSslSocket::sslLibraryVersionString() 返回:一個空字符串

So here is I've grab and install OpenSSL in 1.0.2 version, (unistall the other one), add to the PATH variable the install folder (which is simply C:\OpenSSL-Win64, also tried C:\OpenSSL-Win64 \bin 這兩個文件都包含 dll)

不幸的是我仍然有同樣的問題。

安裝文件夾內容:

  • 垃圾桶
  • 經驗
  • 包括
  • 更改.txt
  • 常見問題解答.txt
  • libeay32.dll
  • libssl.dll
  • 許可證.txt
  • 新聞.txt
  • 自述文件.txt
  • ssleay32.dll
  • unins000.dat
  • unins000.exe

Now I've tried to do somethings after I've read Qt documentation: https://doc.qt.io/qt-5/windows-requirements.html

  • 我在 C:\Windows\System32 中復制/粘貼目錄 OpenSSL-Win64 (根據文檔,首先在此目錄中查看 openSSL 庫)-> 不起作用
  • 我創建了一個 PATH 環境變量,並為其提供了 openSSL 安裝文件夾的值(現在我使用默認創建的“路徑”環境變量,它覆蓋了默認值,但我設法恢復了它) -> 沒用

根據問題提供的信息,您似乎安裝了太新的 OpenSSL 版本。 事實上,我已經遇到了同樣的問題

正如您所發現的,Qt 沒有嵌入 OpenSSL。 您要做的就是自己安裝它。 但是您應該確保您擁有與用於 Qt 構建的版本相同(或最接近)的 OpenSSL 版本

  • 您可以檢查 OpenSSL 的版本用於 Qt 構建:
qDebug() << QSslSocket::sslLibraryBuildVersionString();
  • 您可以檢查 SSL 是否支持:
qDebug() << QSslSocket::supportsSsl();
  • 您可以檢查您使用的版本:
qDebug() << QSslSocket::sslLibraryVersionString();

注意:不要忘記將安裝目錄包含到 PATH 環境變量中以使dll可訪問(或復制dll )。


讓我知道它是否不能解決您的問題,以便我可以刪除此答案以避免不必要的噪音。

答案肯定有效,但您必須找到 ZE8801102A40AD89DDCFDCAEBF008D25Z 應用程序所需的 OpenSSL 庫的幾乎完全匹配。

這可能並不容易。 由於各種原因, https://slproweb.com/products/Win32OpenSSL.html的家伙似乎特別堅決不支持舊版本的 ZEE302FD5FD2A7A5A3C19FC5BE21F979。

我明白了; 它確實有道理,但在我們的例子中,它是一個服務器端組件,它對一個眾所周知的公共 https 位置進行了“獲取”,只有一個 URL。 (一個 API)。 恕我直言,舊版本沒有真正的漏洞,但我意識到這對於每個應用程序來說肯定不是真的。

我的解決方法是在 Visual Studio 調試器中打開應用程序。 (任何顯示需求加載 DLL 的調試器都可以工作)。 然后我點擊“運行”。

我發現我們最近編譯的應用程序從“Folding at Home”加載了 OpenSSL,盡管事實上我已經在我們的測試盒上加載了每個版本的 OpenSSL(並驗證了路徑位置)。 不會跑。

在我的開發盒上,我從未加載過 OpenSSL,但代碼運行良好。

我添加了@Fareanor 建議的代碼行(也支持他的回答:):

qDebug() << QSslSocket::sslLibraryVersionString();

我們的代碼說:OpenSSL 需要版本:“OpenSSL 1.0.2p 14 Aug 2018”

我的 Dev box 上的代碼是按需加載:

C:\Program Files (x86)\FAHClient\SSLEAY32.dll

您的可能會有所不同。

FAH 客戶端版本為 1.0.2o,或 DLL 模塊版本:1.0.2.15。 web 站點的最舊版本是:1.0.2.21,即使直接放在運行位置(始終在 PATH 位置之前檢查)也不會加載。

一旦我將 OpenSSL 文件從 Folding at Home 復制到我的 Dev 盒子的 Prod 盒子,突然 OpenSSL 開始在我們的代碼中工作。

We also needed these files: 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 ==

這是解決方案(對我有用):

  • 檢查哪個版本的 OpenSSL 用於使用 qDebug 構建的 Qt(請參閱 Fareanor 答案)。
  • 下載 OpenSSl 的關閉版本,用於 Windows 64 位,因為它是我的操作系統。
  • 執行下載的安裝程序並選中“將 OpenSSL DLLs 復制到:Windows 系統目錄”復選框

謝謝回復:

以下是從 qDebugs 獲得的信息:

- QSslSocket::sslLibraryBuildVersionString() returned: "OpenSSL 1.0.2p  14 Aug 2018"  

- QSslSocket::supportsSsl() returned: false  

- QSslSocket::sslLibraryVersionString() returned: an empty string

所以這里是我在 1.0.2 版本中安裝了 OpenSSL,(卸載另一個),將安裝文件夾(它只是 C:\OpenSSL-Win64)添加到 PATH 變量

不幸的是我仍然有同樣的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM