Я работаю над приложением Qt, которое связывается с моим веб-браузером (в настоящее время Google Chrome) через WebSocket.
Все работало нормально, пока я не попытался использовать защищенные веб-сокеты …
Мне удалось решить проблемы, которые у меня были с OpenSSL, так что теперь у меня должно быть работающее приложение Qt, но я этого не делаю.
Я использую VS2013 и Qt 5.3. У меня есть следующий код для запуска моего сервера:
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);
}
Я создал файлы сертификатов, используя следующий метод: https://developer.salesforce.com/blogs/developer-relations/2011/05/generating-valid-self-signed-certificates.html
На стороне браузера у меня есть только:
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!');
};
К сожалению, каждый раз, когда я пытался, я получал следующее сообщение JS:
WebSocket connection to 'wss://localhost:52132/' failed: Error in connection establishment: net::ERR_TIMED_OUT
До сих пор:
QSslSocket::supportsSsl ()
возвращается true
QSslSocket: cannot resolve XXX method
СообщенияЗагружаются библиотеки OpenSSL, VS2013 выводит следующие сообщения:
«MyProject.exe» (Win32): загружен «I: \ Sources \ VS2013 \ x64 \ Release \ ssleay32.dll». Не удается найти или открыть файл PDB.
«PressAndListenQt.exe» (Win32): загружен «I: \ Sources \ VS2013 \ x64 \ Release \ libeay32.dll». Не удается найти или открыть файл PDB.
Я не знаю, как найти то, что не так, поэтому я открыт для любых предложений!
Редактировать: Я попытался создать самозаверяющий сертификат, используя следующее (вместо ссылки выше):
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 100 -nodes
Теперь я получаю еще одну ошибку:
WebSocket connection to 'wss://localhost:52132/' failed: WebSocket opening handshake was canceled
Согласно вашей постановке проблемы
В Qt \ examples \ Qt-5.x \ websockets \ sslechoserver есть пример кода, а также html-файл с html-кодом websocket. Если мы запустим приведенный выше пример и посмотрим ответ веб-сокета, он выдаст код ошибки 1006. Коды ошибок.
Я посмотрел на возникшие ошибки, и я думаю, что это может быть потому, что вы не размещали свой HTML-код на безопасном веб-сервере (не https). Я предлагаю вам разместить ваш html-файл на веб-сервере и сопоставить его с вашими сертификатами для безопасного просмотра https.
Прекращение соединения может быть из-за небезопасных сокетов или несоответствия сертификата.
Консоль браузера
WebSocket connection to 'wss://localhost:1234/' failed: Error in connection establishment: net::ERR_INSECURE_RESPONSE
Трассировка браузера для запроса URL
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
Трассировка браузера для Http Stream
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
похоже, то же самое происходит со мной несколько дней назад.
Я решил доверить самозаверяющий сертификат в оснастку сертификата
что вы можете открыть с помощью консоли MMC.
Импортируйте свой сертификат как в личные папки текущего пользователя, так и в папки локального компьютера, импортируйте сертификат также в папку доверенных издателей. Не забудьте удалить сертификат после теста.
Вы можете сделать то же самое и для сертификата localhost.cert для учебника Qt \ examples \ Qt-5.5 \ websockets \ sslechoserver \ и посмотреть, как веб-страница websockets соединяется с wss, предоставленным в учебнике.
Это сработало для меня, когда веб-сокеты с веб-страницы не смогли подключиться с той же ошибкой.
(извините, мой английский низкий :))
Попробуйте изменить URL из WSS: // локальный: 52132 в https: // или же Http: //. Как предположение WSS: // могут быть отклонены брандмауэрами и серверами за использование собственного протокола.