Qt local secure sockets web

je travaille sur une application Qt qui communique avec mon navigateur web (actuellement Google Chrome) via un WebSocket.

tout fonctionnait bien jusqu'à ce que j'essaie d'utiliser des websockets sécurisés...

j'ai réussi à résoudre les problèmes que J'avais avec OpenSSL, donc maintenant je devrais avoir une application Qt fonctionnelle, mais je ne le fais pas.

j'utilise VS2013, et Qt 5.3. J'ai le code suivant pour démarrer mon serveur:

MyClass::MyClass (quint16 port, QObject *parent) : 
    QWebSocketServer("Press And Listen Server", QWebSocketServer::SecureMode, parent) {

    QSslConfiguration sslConfiguration;
    QFile certFile (QStringLiteral ("localhost.crt"));
    QFile keyFile (QStringLiteral ("localhost.key"));
    certFile.open (QIODevice::ReadOnly);
    keyFile.open (QIODevice::ReadOnly);
    QSslCertificate certificate (&certFile, QSsl::Pem);
    QSslKey sslKey (&keyFile, QSsl::Rsa, QSsl::Pem);
    certFile.close ();
    keyFile.close ();
    sslConfiguration.setPeerVerifyMode (QSslSocket::VerifyNone);
    sslConfiguration.setLocalCertificate (certificate);
    sslConfiguration.setPrivateKey (sslKey);
    sslConfiguration.setProtocol (QSsl::TlsV1SslV3);
    this->setSslConfiguration (sslConfiguration);

    if (!this->listen (QHostAddress::Any, port)) {
        throw ServerNotStartedException () ;
    }
    qDebug () << "Server listenning on: " << port ;
    connect (this, &QWebSocketServer::newConnection, this, &MyClass::onNewConnection);
    connect (this, &QWebSocketServer::closed, this, &MyClass::onClose);
    connect (this, &QWebSocketServer::sslErrors, this, &MyClass::onSslErrors);
}

j'ai créé les fichiers de certificat en utilisant la méthode suivante: https://developer.salesforce.com/blogs/developer-relations/2011/05/generating-valid-self-signed-certificates.html

côté navigateur, je n'ai que:

var websock = websock = new WebSocket('wss://localhost:52132');

websock.onerror = function (error) {
    console.log('Press & Listen, WS Error: ' + error);
};

websock.onopen = function () {
    console.log('Open!');
};
<!-Malheureusement, à chaque fois que j'ai essayé, J'ai reçu le message JS suivant:

WebSocket connection to 'wss://localhost:52132/' failed: Error in connection establishment: net::ERR_TIMED_OUT

pour l'instant:

  • QSslSocket::supportsSsl () retourne true
  • je n'ai pas de QSslSocket: cannot resolve XXX method messages
  • les DLLs OpenSSL sont chargés, VS2013 affiche les messages suivants:

    'MyProject.exe" (Win32): chargé "I:SourcesVS2013x64Releasessleay32.dll". Impossible de trouver ou d'ouvrir le fichier PDB. "PressAndListenQt.exe" (Win32): chargé "I:SourcesVS2013x64Releaselibeay32.dll". Impossible de trouver ou d'ouvrir le fichier PDB.`

je ne sais pas comment trouver ce qui ne va pas, donc je suis ouvert à toute suggestion!

Edit: j'ai essayé de générer un certificat auto-signé en utilisant le suivant (au lieu du lien ci-dessus):

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 100 -nodes

Maintenant j'ai une autre erreur:

WebSocket connection to 'wss://localhost:52132/' failed: WebSocket opening handshake was canceled
14
demandé sur Holt 2015-01-21 01:04:08

3 réponses

selon votre énoncé de problème

  • la Bibliothèque OpenSSL semble OK
  • le Code Qt et le code Html peuvent être bien
  • Serveur Sécurisé manquant

il y a un exemple de code dans Qt \Examples\Qt-5.x\websockets\sslechoserver est aussi un fichier html avec le code html de websocket. Si nous exécutons l'exemple ci-dessus et regardons la réponse de la socket-web il donnera le code d'erreur 1006 Codes D'Erreur.

je ont examiné les erreurs se sont produites et je pense que cela peut être parce que vous n'avez pas hébergé votre code html sur le serveur Web sécurisé(non https). Je vous suggère d'héberger votre fichier html sur webserver et de l'associer à vos certificats de navigation sécurisée https.

la fin de la connexion peut être due à des sockets non sécurisés ou à une inadéquation des certificats.

Console Du Navigateur

WebSocket connection to 'wss://localhost:1234/' failed: Error in connection establishment: net::ERR_INSECURE_RESPONSE 

recherche dans le navigateur pour L'URL Demande

t=11880 [st= 0] +REQUEST_ALIVE  [dt=17]
t=11880 [st= 0]    URL_REQUEST_DELEGATE  [dt=1]
t=11881 [st= 1]   +URL_REQUEST_START_JOB  [dt=16]
                   --> load_flags = 18 (BYPASS_CACHE | DISABLE_CACHE)
                   --> method = "GET"
                   --> priority = "LOWEST"
                   --> url = "wss://localhost:1234/"
t=11881 [st= 1]      URL_REQUEST_DELEGATE  [dt=0]
t=11881 [st= 1]      HTTP_CACHE_GET_BACKEND  [dt=0]
t=11881 [st= 1]     +HTTP_STREAM_REQUEST  [dt=15]
t=11881 [st= 1]        HTTP_STREAM_REQUEST_STARTED_JOB
                       --> source_dependency = 6025 (HTTP_STREAM_JOB)
t=11896 [st=16]        HTTP_STREAM_REQUEST_BOUND_TO_JOB
                       --> source_dependency = 6025 (HTTP_STREAM_JOB)
t=11896 [st=16]     -HTTP_STREAM_REQUEST
t=11896 [st=16]      URL_REQUEST_DELEGATE  [dt=1]
t=11897 [st=17]      CANCELLED
                     --> net_error = -501 (ERR_INSECURE_RESPONSE)
t=11897 [st=17]   -URL_REQUEST_START_JOB
                   --> net_error = -501 (ERR_INSECURE_RESPONSE)
t=11897 [st=17]    URL_REQUEST_DELEGATE  [dt=0]
t=11897 [st=17] -REQUEST_ALIVE

recherche par navigateur pour le flux Http

t=11881 [st= 0] +HTTP_STREAM_JOB  [dt=15]
                 --> alternative_service = "unknown :0"
                 --> original_url = "wss://localhost:1234/"
                 --> priority = "LOWEST"
                 --> source_dependency = 6024 (URL_REQUEST)
                 --> url = "wss://localhost:1234/"
t=11881 [st= 0]   +PROXY_SERVICE  [dt=0]
t=11881 [st= 0]      PROXY_SERVICE_RESOLVED_PROXY_LIST
                     --> pac_string = "DIRECT"
t=11881 [st= 0]      PROXY_SERVICE_DEPRIORITIZED_BAD_PROXIES
                     --> pac_string = "DIRECT"
t=11881 [st= 0]   -PROXY_SERVICE
t=11881 [st= 0]   +SOCKET_POOL  [dt=15]
t=11896 [st=15]      SOCKET_POOL_BOUND_TO_CONNECT_JOB
                     --> source_dependency = 6026 (CONNECT_JOB)
t=11896 [st=15]      SOCKET_POOL_BOUND_TO_SOCKET
                     --> source_dependency = 6029 (SOCKET)
t=11896 [st=15]   -SOCKET_POOL
                   --> net_error = -202 (ERR_CERT_AUTHORITY_INVALID)
t=11896 [st=15]    HTTP_STREAM_JOB_BOUND_TO_REQUEST
                   --> source_dependency = 6024 (URL_REQUEST)
t=11896 [st=15] -HTTP_STREAM_JOB
3
répondu Mozfox 2017-02-23 19:49:14

il semble qu'il m'arrive la même chose il y a quelques jours. J'ai résolu de faire confiance au certificat auto-signé dans le composant logiciel enfichable certificats que vous pouvez ouvrir en utilisant la console MMC. Importez votre certificat à la fois dans les dossiers personnels de l'utilisateur courant et les dossiers informatiques locaux, importez le certificat aussi dans le dossier des éditeurs de confiance. N'oubliez pas de retirer le certificat après le test.

vous pouvez faire la même chose pour le localhost.cert certificat pour le tutoriel Qt\Exemples\Qt-5.5\websocket\sslechoserver\ et voyez comment une page Web de websockets se connecte avec le wss fourni par le tutoriel.

cela a fonctionné pour moi quand les websockets de webpage n'ont pas réussi à se connecter avec la même erreur.

(désolé, mon anglais est faible :) )

2
répondu OOP 2016-02-09 14:42:29

essayez de modifier l'url de wss: / / localhost:52132 https:// ou http://. Comme une supposition wss:// pourrait être rejeté par les pare-feux et les serveurs pour être un protocole personnalisé.

-1
répondu SACn 2017-02-24 07:08:43