Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.7.1 - Qt Creator : 4.2.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Qt et Openssl

22 Feb modifié dans Qt / Langage C++
Bonjour à tous depuis un moment je tente de faire fonctionner le cryptage de données entre un client serveur.

j' ai créer une clé privée et un certificat auto-signé.
Sous ubuntu studio
Cela ne fonctionne pas et je ne comprend pas pourquoi. Différents paramétrage donnent des erreurs différentes....


coté client :
#include <QSslSocket>
client->abort();
QSslConfiguration sslConfiguration;
QFile certFile(QStringLiteral("ssl/manager.crt"));
QFile keyFile(QStringLiteral("ssl/manager.key"));
certFile.open(QIODevice::ReadOnly);
keyFile.open(QIODevice::ReadOnly);
QSslCertificate certificate(&certFile, QSsl::Pem);
QSslKey sslKey(&keyFile, QSsl::Rsa, QSsl::Pem,QSsl::PrivateKey,"caribertus est mon nom latin");
certFile.close();
keyFile.close();
sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone);
sslConfiguration.setLocalCertificate(certificate);
sslConfiguration.setPrivateKey(sslKey);
sslConfiguration.setProtocol(QSsl::SslV2);
client->setSslConfiguration(sslConfiguration);
// On désactive les connexions précédentes s'il y en a
client->connectToHostEncrypted(dd.getIP(),port);

if(!client->waitForConnected(2000)){
coté serveur :
QSslConfiguration sslConfiguration = QSslConfiguration::defaultConfiguration();
QFile certFile(QStringLiteral("ssl/manager.crt"));
QFile keyFile(QStringLiteral("ssl/manager.key"));
certFile.open(QIODevice::ReadOnly);
keyFile.open(QIODevice::ReadOnly);
QSslCertificate certificate(&certFile, QSsl::Pem);
QSslKey sslKey(&keyFile, QSsl::Rsa, QSsl::Pem,QSsl::PrivateKey,"caribertus est mon nom latin");
certFile.close();
keyFile.close();
sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone);
sslConfiguration.setLocalCertificate(certificate);
sslConfiguration.setPrivateKey(sslKey);
sslConfiguration.setProtocol(QSsl::SslV2);
newSocket->setSslConfiguration(sslConfiguration);
queue.enqueue(newSocket);
 socket->startServerEncryption();

message d' erreurs :
qt.network.ssl: QSslSocket::startClientEncryption: cannot start handshake on non-plain connection
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv2_server_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv2_server_method
Serveur : void SSLProcessor::erreurSocketServeur(QAbstractSocket::SocketError) QAbstractSocket::SocketError(21) "Error creating SSL context (error:140A90C4:SSL routines:SSL_CTX_new:null ssl method passed,

Réponses

  • Salut,
    je ne connais pas vraiment le sujet mais
    1) es-tu sûr que la lib ssl est installée sur la machine
    2) que donne certFile.exists() et keyFile.exists()
  • Salut,
    merci pour ta réponse...
    Oui la lib openssl est bien installée, la toute dernière version, il y a eu semble t' il dans un passé récent des problèmes majeurs avec openssl...

    Quant au clé oui elles sont bien présentes, ceci dit n' étant pas un spécialiste du cryptage je m' interroge sur la procédure de génération et le protocole notamment.
  • Quel systeme ? Quelles versions ?

    On a eu le probleme recement. De mémoire, Qt est fourni avec les libs de SSL pour MSVC 2013 (dans QtCreator je crois). Quand on build avec MSVC 2015, il faut donc fournir les libs de MSVC 2013 et 2015. On a voulu recompiler SSL pour MSVC 2015... et cela ne fonctionnait pas avec Qt. La raison est que Qt ne supporte pas encore SSL 1.1.0. On a recompiler OpenSSL version 1.0 avec MSVC 2015 et cela fonctionnait.

    Bref, peut etre un probleme de version.
  • Merci pour ta réponse.

    Ubuntu studio version 16.04
    Qt 5.8
    "Qt ne supporte pas encore SSL 1.1.0" je pense en effet qu' il s' agit d' un problème de ce type. J' ai recompiler les différentes versions mais pas vu de changement, je vais tenter à nouveau en utilisant la version 1.0
  • pas trouvé la version 1.0 mais 1.0.1 même problème.
    re installé la dernière version, toujours pareil. Il plante systématiquement sur les test à partir de sslv3
  • modification des erreurs en utilisant
    QSsl::SecureProtocols
    connected client ...
    qt.network.ssl: QSslSocket::startClientEncryption: cannot start handshake on non-plain connection
    void SslClient::erreurSocketServeur(QAbstractSocket::SocketError) QAbstractSocket::SocketTimeoutError "Network operation timed out"
    encrypted false
  • Pour les versions actuelles de Qt (Qt5.6.2) il vaut mieux utiliser openssl 1.0.2 (g,h,i,j,k) .et il faut bien sur les specifier dans LIBS+= dans le .pro
  • Après des recherches je me rend compte que j' abordais le processus de chiffrement de manière erronée
    le client doit faire une demande au serveur d' une connexion chiffrée, sans aucune information complémentaire si ce n' est l' ip et le port.
    le serveur doit répondre en fournissant les clé et c' est donc le flux d' échange qui sera chiffré pour cette connexion à partir des informations fournis par le serveur.
    Il n' y a pas d' identification mais seulement un chiffrement des données.
    Ce qui explique en partie certaines erreurs.
    Je reconstruit et je tiens au courant.
    Je m' interroge toujours concernant la génération de clé et certificat auto-signé pour la version de Qt 5.8 et la version qui fonctionne avec Qt, d' openssl.
  • pour la version d'openssl avec la 5.8 cf http://wiki.qt.io/Qt_5.8_Tools_and_Versions c'est apparemment à partir de la 1.0.2g sur ubuntu (la h,i,j,k devraient aussi fonctionner)
  • Merci stephane je vais mettre en application....
  • moi j'utilise openssl pour des requetes en https (et aussi du cryptage dans certains cas) et il faut mettre dans le . pro LIBS+= -L'chemin des libs openssl' -lssl -lcrypto en plus des autres librairies.mais je n'utilise pas de certificats coté application.
  • Bonjour à tous,

    j' ai tout bien reconstruit, ( pas simple ) mais j' ai très exactement les mêmes erreurs.
    Connected....
    qt.network.ssl: QSslSocket::startClientEncryption: cannot start handshake on non-plain connection
    error client void SslClient::erreurSocketServeur(QAbstractSocket::SocketError) QAbstractSocket::SocketTimeoutError "Network operation timed out"
    encrypted false
    J' utilise la version openssl 1.0.2g très précisément et voici ma génération de clé
    openssl req -x509 -newkey rsa:1024 -keyout key.key -out key.pem -days 365 -nodes
    Dans le pro bien entendu le chemin des libs...

    Il s' agirait donc d' un problème de clé.


    Pour ceux qui possèdent des caméras ip, : https://abccamips.eu testé sur peu de machines...
  • ca a l'air sympa. je vais l'essayer avec ma cam ip HEDEN et te dis si cela fonctionne avec (le temps d'installer les libs).
  • il me manque libQt5GStreamerui-1.0.so.en tout cas ca n'est pas dans la version Qt5.6.2.....tant pis...
  • Merci pour le test....
    sudo apt-get update
    sudo apt-get install libqt5gstreamerui-1.0-0
    Je vais le rajouter sur le site ( un oubli...).
  • En ce qui concerne le problème openssl, cela progresse...
    openssl req -x509 -newkey rsa:1024 -keyout key.key -out key.pem -days 365
    La commande ci-dessus sans l' option -nodes permet de générer une clé encrypted et un certificat auto-signé, ce qui n' est pas le cas avec l' option -nodes.

    Je reçois l' intégralité de mes données et sans aucun message d' erreur. Seul hic, quand je contrôle avec wireshark les données ne semblent pas encrypted du tout. C' est pour le moins problèmatique.

    Cette application client/serveur sera intégré dans l' application de gestion des caméras.
  • a propos du logiciel.j'ai d'abord essayé avec des qt 5.6.2 et 5.8 telechargées depuis le site Qt mais elles ne comportent pas cette librairie.ensuite j'ai installé le Qt5.3.2 livré avec mon debian 8 mais je ne l'ai pas vu non plus.il y a une libqtgstreamerui-0.10 mais pas la tienne....dommage c'est quelle version de Qt qui est utilisée dans ton logiciel ?
  • sudo apt-get update
    sudo apt-get install libqt5gstreamerui-1.0-0
    Normalement cela devrait s' installer...

    Ce n' est pas une librairie Qt et la version 0.10 est obsolète
    Il tourne avec la version 5. ++
    Sinon il y a packages.ubuntu.com/yakkety/libs/libqtgstreamerui-1.0-0
  • non ce package n'existe pas apparemment dans debian 8.mais peut etre dans debian 9 et comme debian 9 sort normalement d'ici environ 1 mois en version stable je n'ai pas trop à attendre....a moins de le compiler sur le site QtGStreamer que j'ai vu si c'est cela.mais la derniere version date de 2014 je crois, et c'est la 1.2.0.
  • 25 Feb modifié
    oui c'est cela en fait c'est Qtgstreamer 1.2.0 meme si le package s'appelle 1.0 donc je vais le compiler....
  • Les protocoles ::SslV2 et ::SslV3 sont désactive sur ubuntu mais pas seulement. Ils présentent des failles de sécurité majeurs. A vérifier si elles sont bien désactivées, parce que souvent employés.

    Qt préconise .setProtocol(QSsl::SecureProtocols) qui permettra d' employer normalement le protocole de remplacement utilisé par openssl, mais dans mon cas les données ne sont pas cryptées.
  • Sous Debian jessie j' avais du le compiler me semble t' il quoique la version dont j' ai donné le lien est compatible debian.
    Le package 1.0 est 1.2 dernière version.
  • oui en fait c'est dans la testing donc ca arrive dans debian 9, donc j'attendrai qu il sorte dans environ un mois pour l'installer, et ensuite ton appli...car la compil veut pas trop bien fonctionner...
  • Sur le site gstreamer en effet la version dispo ne se compile pas bien, je l' avais installé de mémoire avec le lien ci-dessus et sans aucun problème.
  • Pour Qt et openssl cela fonctionne. j' attendais que wireshark m' indique quel protocole est utilisé et que les données sont encryptées, mais il ne le fait pas malgré tout les données sont bien encryptées et le certificat est transmis.

    Pour ceux qui sont intéressés par l' utilisation de QsslSocket et des données cryptées, je récapitule :
    openssl req -x509 -newkey rsa:1024 -keyout cle.key -out cert.pem -days 365
    Commande openssl pour générrer une clé et un certificat auto signé. 365 étant le nombre de jours de validité. ne pas indiquer un chiffre trop important, openssl le réduirai à 30 jours d' office.

    Le client :
    client->connectToHostEncrypted(ip, port)
    le serveur :
    QSslConfiguration sslConfiguration;
    QFile certFile(QStringLiteral("ssl/cert.pem"));
    QFile keyFile(QStringLiteral("ssl/cle.key"));
    certFile.open(QIODevice::ReadOnly);
    keyFile.open(QIODevice::ReadOnly);
    QSslCertificate certificate(&certFile, QSsl::Pem);
    QSslKey sslKey(&keyFile, QSsl::Rsa, QSsl::Pem,QSsl::PrivateKey,"votre phrase clé");
    certFile.close();
    keyFile.close();
    sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone);
    sslConfiguration.setLocalCertificate(certificate);
    sslConfiguration.setPrivateKey(sslKey);
    sslConfiguration.setProtocol(QSsl::SecureProtocols);
    socket->setSslConfiguration(sslConfiguration);
    socket->setSocketOption(QAbstractSocket::KeepAliveOption, true );
    socket->startServerEncryption();
    newConnection()
    {
    quintptr sd = this->socketDescriptor();
    incomingConnection(sd);
    currentSocket = nextPendingConnection();
    ->sslconfiguration

    incomingConnection(sd) dans le cas ou le signal n' est pas émit comme ce peut être le cas dans un QThread ou derrière un proxy...

Connectez-vous ou Inscrivez-vous pour répondre.