Partage
  • Partager sur Facebook
  • Partager sur Twitter

[QT + SSL] Ils veulent pas travailler ensemble

Malgré plusieurs manipulations

Sujet résolu
    11 avril 2021 à 21:22:52

    Bonsoir à tous,

    J'ai un problème auquel j'espère certains auront des réponses. Pour mon programme j'ai besoin de récupérer des données sur des pages web, et ça j'y arrive très bien :

    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    		manager->get(QNetworkRequest(QUrl("http://monsite.fr")));
    		QObject::connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(data(QNetworkReply*)));
    void data(QNetworkReply *reply)
    {
    	qDebug() << reply->error();
    
    	QByteArray content = reply->readAll();
    	qDebug() << QString(content);
    }

    Mais le problème, c'est que la page à laquelle je veux accéder est en HTTPS et là ça ne marche plus. J'ai l'erreur suivante :

    qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
    QNetworkReply::UnknownNetworkError

    Après investigation j'ai vu qu'il fallait installer OpenSSL et configurer son projet pour qu'il l'utilise car Qt ne le prend pas en charge par défaut. En effet, le code suivant :

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

    m'affiche :

    false "OpenSSL 1.1.1g  21 Apr 2020" ""

    J'ai donc lancé le Maintenance Tool depuis C:/Qt/MaintenanceTool.exe, et installé OpenSSL v.1.1.j (il veut la 1.1.1g d'après le retour précédent, mais "j" étant après "g" je suppose que c'est bon ?). Donc logiquement OpenSSL est installé !

    Ensuite pour mon projet, dans le fichier .pro j'ai rajouté les lignes :

    LIBS = -LC:/Qt/Tools/OpenSSL/Win_x64/lib-llibssl\
           -LC:/Qt/Tools/OpenSSL/Win_x64/lib-llibcrypto

    INCLUDEPATH = C:/Qt/Tools/OpenSSL/Win_x64/include

    Et enfin j'ai inclu :

    #include <openssl/aes.h>

    (d'ailleurs à ce sujet ça me parait bizarre d'avoir le .h... La lib doit être écrite en C, mais devrait pas y avoir une lib C++ ou alors avec Qt qui serait équivalente ? Ca me paraitrait plus "propre")

    Et pour terminer j'ai inclu les deux fichiers .lib dans le dossier de l'exécutable, à savoir : libcrypto.lib et libssl.lib (bien que ça me paraisse également bizarre au vu des lignes ajoutées dans le .pro).

    Et j'en suis au stade que toutes ces manip' n'ont absolument rien changé.

    Quelqu'un à des pistes ?

    Merci par avance.

    • Partager sur Facebook
    • Partager sur Twitter
      12 avril 2021 à 1:09:43

      Grosse confusion sur le rôle de chaque fichier. Les .lib sont des fichiers pour les développeurs, des archives de fichiers objets ou bien des librairies d'import, ce n'est pas du code machine.

      1. Il ne sert probablement à rien d'ajouter ces lignes dans LIBS, car elles font parties des dépendances de Qt (enfin j'utilise CMake, mais dans qmake ça doit aussi marcher). D'ailleurs je crois que Qt charge les dll d'OpenSSL au runtime, il n'y a aucune liaison.

      2. Pour exécuter ton programme, tu as besoin des dll, pas des .lib

      3. Tu n'as pas besoin de faire des inclusions directes des headers d'OpenSSL sauf si tu appelles directement son interface, ce qui m'étonnerait.

      -
      Edité par SpaceIn 12 avril 2021 à 1:17:53

      • Partager sur Facebook
      • Partager sur Twitter
        12 avril 2021 à 9:24:07

        Bonjour SpaceIn,

        Déjà merci pour ta réponse. En effet je parlais bien des .dll que j'avais copié dans le dossier de l'exécutable, et non pas de .lib. Désolé pour cet étourderie.

        Mais je confirme, j'ai toujours false qui est retourné avec la commande QSslSocket::supportsSsl():(

        Et concernant les commandes LIBS et l'include, en attendant je les met comme ça je peux me dire que si ça ne marche pas, ce n'est pas parce que j'ai oublié ces lignes. Au cas, quand ça fonctionnera je les enlèverai une à une voir si c'est vraiment inutile.

        Quoiqu'il en soit, même avec les dll dans le dossier, OpenSSL n'est pas "détecté".

        • Partager sur Facebook
        • Partager sur Twitter
          12 avril 2021 à 12:35:34

          >même avec les dll dans le dossier, OpenSSL n'est pas "détecté".

          Je crois que Qt a un mécanisme de chargement de Dll bien plus sophistiqué que de chopper bêtement les Dll (potentiellement plein de virus) qui traîneraient dans un répertoire osef, répertoire contenant l'exécutable compris.

          Ca doit être marqué quelque-part dans la documentation.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            13 avril 2021 à 8:23:30

            Bonjour bacelar,

            Merci pour ta réponse !

            Cependant je me suis un peu penché sur ta solution. Mais ça ne me paraît pas être la plus pratique. En effet, il faut :

            • créer un objet QLibrary pour chacune des dll
            • utiliser la méthode resolve pour utiliser la fonction de la dll
            • cette méthode renvoie un pointeur void* que l'on doit caster
            • et enfin je vais pouvoir utiliser la fonction voulue.

            Bref ça me paraît bien lourd pour pas grand chose au final.

            D'autant plus que quand j'avais cherché sur internet avant de poster ici, les gens n'allaient pas jusque là. Et la plupart des discussions sont marquées comme résolues. Alors je ne vois pas ce qu'il me manque :(

            • Partager sur Facebook
            • Partager sur Twitter
              13 avril 2021 à 10:27:51

              Si vous pensez vous abstraire des "conventions", utilisez ProcMon (https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) pour voir où le chargeur de votre OS furette pour trouver les Dll (et vous ferez moins le malin ;)).
              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                13 avril 2021 à 14:11:59

                Il ne faut pas confondre ajouter SSL pour l'utiliser toi et pour que Qt l'utilise. Les include, includepath, QLibrary ou ProcMon, c'est pas pour que Qt utilise SSL. Donc pas ce que tu veux a priori.

                Par contre, il faut que Qt puisse trouver les libs (les .dll). Pour cela :

                - sois tu mets les libs dans le système

                - sois tu ajoutes le chemin vers les libs dans PATH

                - sois tu indiques a qmake de link ces libs

                Ce que tu as voulu faire au début était presque correct, mais -L permet juste d'indiquer un chemin. Il faut aussi indiquer les libs a linker avec -l (L minuscule). Par exemple :

                LIBS += -L"C:\Qt\Tools\OpenSSL\Win_x64\bin" -lcrypto-1_1-x64 -lssl-1_1-x64
                

                (je n'ai pas de window sous la main pour tester)

                • Partager sur Facebook
                • Partager sur Twitter
                  13 avril 2021 à 20:18:36

                  Bonjour gbdivers !

                  J'ai fait comme tu as dis, et ça a marché ! Alors un grand merci à toi :)

                  Comme quoi on peut être plus malin en se soustrayant aux pseudos conventions !

                  Je marque le sujet comme étant résolu, encore un grand merci :)

                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 avril 2021 à 21:14:44

                    >Comme quoi on peut être plus malin en se soustrayant aux pseudos conventions !

                    LOL, ou en lisant la documentation, RTFM. ;)

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                      14 avril 2021 à 3:10:46

                      De mémoire, ce n'est pas très clair dans la doc de Qt. C'est expliqué je crois dans la doc de build de Qt. Mais un utilisateur lambda ne build (et ne doit pas) build Qt lui même. Donc ce n'est pas surprenant qu'il n'ait pas trouvé comment faire.

                      -
                      Edité par gbdivers 14 avril 2021 à 3:18:29

                      • Partager sur Facebook
                      • Partager sur Twitter

                      [QT + SSL] Ils veulent pas travailler ensemble

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown