[英]Statically compiled Qt 5.13.1 with OpenSSL 1.1.1d producing QSslSocket::connectToHostEncrypted: TLS initialization failed
[英]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 庫)但它仍然不起作用。
所以這是我到目前為止所做的:
我錯過了什么?
編輯:
謝謝回復:
以下是從 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)
不幸的是我仍然有同樣的問題。
安裝文件夾內容:
Now I've tried to do somethings after I've read Qt documentation: https://doc.qt.io/qt-5/windows-requirements.html
根據問題提供的信息,您似乎安裝了太新的 OpenSSL 版本。 事實上,我已經遇到了同樣的問題。
正如您所發現的,Qt 沒有嵌入 OpenSSL。 您要做的就是自己安裝它。 但是您應該確保您擁有與用於 Qt 構建的版本相同(或最接近)的 OpenSSL 版本。
qDebug() << QSslSocket::sslLibraryBuildVersionString();
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 ==
這是解決方案(對我有用):
謝謝回復:
以下是從 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.