Как подключиться к серверу с помощью Secure WebSocket в Qt c ++ - PullRequest
0 голосов
/ 08 июня 2019

Я создаю приложение Qt, которое должно иметь возможность подключения к серверу через безопасное соединение (например, wss: //xxx.xxx.xxx.xxx: 8080), Приложение работает нормально с незащищенным соединением (т.е.ws: //xxx.xxx.xxx.xxx: 8443).

Используемый мной протокол - WebSocket.Я использовал библиотеку для подключения.

Qt Creator 3.4.2 (с открытым исходным кодом) На основе Qt 5.5.0 (MSVC 2013, 32-разрядная версия)

QsslSocket:: supportSsl () возвращал false , затем обнаружил, что мне не хватало файлов библиотеки openssl ( libeay32.dll, ssleay32.dll ), затем я поместил эти файлы впуть к моему приложению и снова запустите код QSslSocket :: supportSsl () возвращает true .но когда я пытаюсь подключить websocket, он показывает следующие ошибки.

connect (& wsocket, SIGNAL (ошибка (QAbstractSocket :: SocketError)), SLOT (onError (QAbstractSocket :: SocketError)), Qt :: DirectConnection);connect (& wsocket, SIGNAL (sslErrors (QList)), SLOT (onSslErrors (QList)), Qt :: DirectConnection);

onSslErrors: неизвестная ошибка onError: «Имя хоста не соответствует ни одному издействительные хосты для этого сертификата "Ошибка: QAbstractSocket :: SocketError (13)

фрагмент кода со стороны клиента (Qt)

void onConnectToServer()
{
   qRegisterMetaType<QAbstractSocket::SocketError>();
    qRegisterMetaType<QAbstractSocket::SocketState>();
    connect(&wsocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(onError(QAbstractSocket::SocketError)), Qt::DirectConnection);
    connect(&wsocket, SIGNAL(sslErrors(QList<QSslError>)), SLOT(onSslErrors(QList<QSslError>)), Qt::DirectConnection);
    connect(&wsocket, SIGNAL(connected()), SLOT(onConnected()), Qt::DirectConnection);
    connect(&wsocket, SIGNAL(binaryMessageReceived(QByteArray)), SLOT(onBinaryMessage(QByteArray)), Qt::DirectConnection);
    connect(&wsocket, SIGNAL(textMessageReceived(QString)), SLOT(onTextMessage(QString)), Qt::DirectConnection);
    connect(&wsocket, SIGNAL(disconnected()), SLOT(onDisconnected()), Qt::DirectConnection);
    connect(&wsocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), SLOT(onStateChanged(QAbstractSocket::SocketState)), Qt::DirectConnection);

    QUrl serverURL;
    QWebSocket wsocket;

     // some code for here and setting **serverURL**

    wsocket.setPauseMode(QAbstractSocket::PauseNever);
    wsocket.open(serverURL);

}

void onSslErrors(const QList<QSslError> &errors)
{
    qDebug() << wsocket.errorString();
}

void onError(const QAbstractSocket::SocketError &socketError)
{
    qDebug() << wsocket.errorString() << " Error:" << socketError;
}

void onConnected()
{
    qDebug() << "Successfully Connected with " << serverURL;
}

void onDisconnected()
{
    qDebug() << wsocket.errorString() << " CloseCode is >>> " << wsocket.closeCode();
}

void onStateChanged(QAbstractSocket::SocketState socketState)
{
    qDebug() << "StateChanged : " << socketState;
}

какРешить это любой может иметь представление о том, как подключить безопасный веб-сокет.я проверил SSL Echo Client Пример , но похоже, что на стороне сервера также должен быть Qt WebSocket.

Q1) Как сделать безопасное соединение, используя Qt со стороны клиента?

ПРИМЕЧАНИЕ. На стороне сервера уже настроено безопасное соединение.

Q2) На стороне сервера не указан Qt-код, а на стороне клиента - Qt.это в безопасном соединении веб-сокета?(т.е. сокет сервера и сокет клиента не зависят от языка программирования для подключения или нет?)

ПРИМЕЧАНИЕ. Я могу подключиться к одному и тому же серверу без использования безопасного соединения.

1 Ответ

0 голосов
/ 18 июня 2019

Я все-таки нашел решение,

Перед тем как открыть соединение с удаленным сервером с помощью этой линии,

wsocket.open (ServerURL);

Я добавил QSslConfiguration и проигнорировал ошибку ssl для самозаверяющего сертификата для разработки, конечно, я исправлю это в Production.

QSslConfiguration sslConfiguration = wsocket.sslConfiguration();
sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyPeer);
wsocket.setSslConfiguration(sslConfiguration);
wsocket.ignoreSslErrors();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...