Qt локальные защищенные сетевые сокеты

Я работаю над приложением Qt, которое связывается с моим веб-браузером (в настоящее время Google Chrome) через WebSocket.

Все работало нормально, пока я не попытался использовать защищенные websockets...

Мне удалось решить проблемы с 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
  • Загружаются DLL 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

Ответы

Ответ 1

Согласно вашему заявлению о проблеме

  • Библиотека OpenSSL выглядит нормально
  • Код Qt и HTML-код могут быть точными
  • Защищенный сервер MISSING

Существует пример кода в Qt\Examples\Qt-5.x\websockets\sslechoserver также html файл с кодом websocket html. Если мы проведем над образцом и посмотрим на ответ веб-сокета, он выдаст код ошибки 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

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

Ответ 2

похоже, что то же самое происходит и несколько дней назад. Я решил доверять самоподписанному сертификату в оснастке сертификатов которую вы можете открыть с помощью консоли MMC. Импортируйте свой сертификат как в личную папку текущего пользователя и локального компьютера, так и в сертификат импорта в папку доверенных издателей. Не забудьте удалить сертификат после теста.

Вы также можете указать сертификат localhost.cert для учебника Qt\Examples\Qt-5.5\websockets\sslechoserver\и посмотреть, как веб-страница веб-сайтов соединяется с wss, предоставленной учебником.

Это сработало для меня, когда веб-узлы с веб-страницы не смогли подключиться к той же ошибке.

(извините, мой английский низкий:))

Ответ 3

Попробуйте изменить URL-адрес от wss://localhost: 52132 до https:// или http://. Поскольку предположение wss:// может быть отклонено брандмауэрами и серверами для использования в качестве настраиваемого протокола.