web-dev-qa-db-ja.com

GETリクエストでTLSの初期化に失敗しました

私はqt/c ++から始めて、プロジェクトでjson post/get/putを作成する必要がありますが、単純なgetリクエストを実行しようとしていますが、エラーがあります:qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed

理由はわかりませんが、いくつかの方法を試しましたが、すべて同じメッセージが表示されました。使用するコードを添付します。

mainwindow.cpp:

void MainWindow::replyFini(QNetworkReply* reply)
{
    QString answer = QString::fromUtf8(reply->readAll());
    qDebug() << "answer------------>"<<answer;
}

void MainWindow::on_btn_login_clicked()
{
    QNetworkRequest request(QUrl("https://httpbin.org/get"));
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFini(QNetworkReply*)));
    manager->get(request);
}

mainwindow.h:

#include <QtCore>
#include <QNetworkAccessManager>
#include <QNetworkReply>
10
ikan nedes

SSLライブラリが見つかりません。エラーは Qt Src で読み取ることができます。それらをアプリケーションと共にデプロイするか、マシンにOpenSSLをインストールします。

また、ほんの小さなヒント:

_void MainWindow::replyFini(QNetworkReply* reply)
{
    QString answer = QString::fromUtf8(reply->readAll());
    qDebug() << "answer------------>"<<answer;
}
_

reply->deleteLater();を呼び出す必要があります

_void MainWindow::on_btn_login_clicked()
{
    QNetworkRequest request(QUrl("https://httpbin.org/get"));
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFini(QNetworkReply*)));
    manager->get(request);
}
_

connect(manager, &QNetworkAccessManager::finished, manager, &QNetworkAccessManager::deleteLater);を追加して、クリックごとのメモリリークを回避します。

5
user3606329

Windowsでは、オンラインインストーラーを介してQtをインストールする場合、オプションのコンポーネントとしてOpenSSL Toolkitを選択できます。これにより、Qtと完全に互換性のあるバージョンが提供されます。

インストール時にチェックしていない場合は、C:\Qt\MaintenanceTool.exeを再実行して、[コンポーネントの追加または削除]を選択できます。 OpenSSL Toolkitは、Developer and Designer Toolsセクションの下にあり、これが最後のエントリです。

ただし、サイドバーにメモがあります。

QtインストーラーはOpenSSL環境をセットアップしません。ユーザーはパスと環境変数を定義する必要があります。

したがって、インストールしたら、DLLのあるディレクトリをPATH環境変数に追加するか、必要なDLLを.exeファイルの近くに配置する必要があります(それらをdebugおよびreleaseディレクトリにコピーします)あなたのプロジェクト)。

ディレクトリはC:\Qt\Tools\OpenSSL\Win_x64\bin(32ビットバージョンが必要な場合はWin_x86)にあります。 DLLは、私の場合、libssl-1_1-x64.dllおよびlibcrypto-1_1-x64.dllという名前です。


しかし、これを別のマシンにデプロイするには不十分で、すべてコピーした後、同じエラーが再び発生しました。その理由は、OpenSSL DLLがQtアプリ自体とは別のMSVCランタイムバージョンに依存しており、これらのエラーが報告されないためです。これらのDLLを Dependency Walker で開いて、欠落しているものを見つけます。私の場合はMSVCR100.dllだったので、 MSVC 2010再頒布可能x64x86はこちら )をインストールする必要がありました。

7
user

私にとってうまくいったのは https://slproweb.com/products/Win32OpenSSL.html OpenSSLライトバージョン(私のコンパイラ用)からダウンロードし、c:\ Program Filesからlibcryptoおよびlibssl DLLをコピーすることでした。\OpenSSL \をプログラムの.exeフォルダーに追加します。

2
Adriel Jr