web-dev-qa-db-fra.com

L'initialisation TLS a échoué sur la demande GET

Je commence par qt/c ++ et sur mon projet j'ai besoin de faire un post/get/put json mais j'essaye de faire une simple requête get mais j'ai une erreur: qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed

Je ne sais pas pourquoi, j'ai essayé quelques méthodes mais toutes ont mis le même message. J'attache le code que j'utilise.

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

Les bibliothèques SSL sont introuvables. L'erreur peut être lue dans Qt Src . Vous pouvez les déployer avec votre application ou installer OpenSSL sur votre machine.

Aussi, juste un petit indice:

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

Vous devez appeler 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);
}

Ajoutez connect(manager, &QNetworkAccessManager::finished, manager, &QNetworkAccessManager::deleteLater); pour éviter une fuite de mémoire à chaque clic.

5
user3606329

Sous Windows, si vous installez Qt via le programme d'installation en ligne, vous pouvez sélectionner OpenSSL Toolkit comme composant facultatif. Cela devrait vous fournir la version définitivement compatible avec votre Qt.

Si vous ne l'avez pas vérifié pendant l'installation, vous pouvez réexécuter C:\Qt\MaintenanceTool.exe et sélectionnez Ajouter ou supprimer des composants. OpenSSL Toolkit est situé sous la section Developer and Designer Tools, c'est la dernière entrée.

Cependant, il y a une note dans la barre latérale:

Le programme d'installation de Qt ne configure pas l'environnement OpenSSL. L'utilisateur doit définir le chemin d'accès et les variables d'environnement.

Donc, une fois installé, vous devez ajouter le répertoire contenant les DLL à la variable d'environnement PATH ou placer les DLL nécessaires près de .exe fichier (copiez-les dans les répertoires debug et release de votre projet).

Le répertoire est situé à C:\Qt\Tools\OpenSSL\Win_x64\bin (ou Win_x86 si vous avez besoin d'une version 32 bits). Les DLL sont nommées libssl-1_1-x64.dll et libcrypto-1_1-x64.dll dans mon cas.


Mais ce n'était pas suffisant pour le déployer sur une autre machine, après avoir tout copié, j'ai de nouveau la même erreur. La raison en est que les DLL OpenSSL dépendent d'une autre version d'exécution MSVC que l'application Qt elle-même, et ces erreurs ne sont pas signalées. Ouvrez ces DLL dans Dependency Walker pour découvrir ce qui manque. Dans mon cas, c'était MSVCR100.dll, j'ai donc dû installer MSVC 2010 Redistributable x64 ( x86 est ici ).

7
user

Ce qui a fonctionné pour moi a été de télécharger à partir de https://slproweb.com/products/Win32OpenSSL.html la version allégée d'OpenSSL (pour mon compilateur) et de copier les DLL libcrypto et libssl depuis c:\Program Files\OpenSSL\dans le dossier .exe de mon programme.

2
Adriel Jr