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 ()
retournetrue
- 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
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
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 :) )
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é.