简体   繁体   English

如何在Qt c ++中使用Secure WebSocket连接服务器

[英]How to connect with server using Secure WebSocket in Qt c++

I am creating Qt application that should be able to connect with server using secure connection (ie wss://xxx.xxx.xxx.xxx:8080), Application is working fine with none-secure connection (ie ws://xxx.xxx.xxx.xxx:8443). 我正在创建应该能够使用安全连接与服务器连接的Qt应用程序(即wss://xxx.xxx.xxx.xxx:8080),应用程序正常工作,没有安全连接(即ws:// xxx。 xxx.xxx.xxx:8443)。

Protocol i am using is WebSocket. 我正在使用的协议是WebSocket。 I have used library for connection. 我用过库来连接。

Qt Creator 3.4.2 (opensource) Based on Qt 5.5.0 (MSVC 2013, 32 bit) Qt Creator 3.4.2(opensource)基于Qt 5.5.0(MSVC 2013,32位)

QsslSocket::supportsSsl() was returning false , then find out that i was missing openssl library files ( libeay32.dll , ssleay32.dll ) then i put these file in the path of my application and run code again now QSslSocket::supportsSsl() is returning true . QsslSocket :: supportsSsl()返回false ,然后发现我缺少openssl库文件( libeay32.dll,ssleay32.dll )然后我将这些文件放在我的应用程序的路径中并再次运行代码QSslSocket :: supportsSsl( )正在返回真实 but when i try to connect websocket it is showing flollowing errors. 但是,当我尝试连接websocket时,它显示出以下错误。

connect(&wsocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(onError(QAbstractSocket::SocketError)), Qt::DirectConnection); connect(&wsocket,SIGNAL(error(QAbstractSocket :: SocketError)),SLOT(onError(QAbstractSocket :: SocketError)),Qt :: DirectConnection); connect(&wsocket, SIGNAL(sslErrors(QList)), SLOT(onSslErrors(QList)), Qt::DirectConnection); connect(&wsocket,SIGNAL(sslErrors(QList)),SLOT(onSslErrors(QList)),Qt :: DirectConnection);

onSslErrors : unknown error onError : "The host name did not match any of the valid hosts for this certificate" Error: QAbstractSocket::SocketError(13) onSslErrors:未知错误onError:“主机名与此证书的任何有效主机都不匹配”错误:QAbstractSocket :: SocketError(13)

code snippet from client side(Qt) 来自客户端的代码片段(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;
}

how to resolve this any one have idea how to connect secure web socket. 如何解决这个问题,任何一个人都知道如何连接安全的Web套接字。 i did check SSL Echo Client Example but it seems like server side also should be Qt WebSocket. 我确实检查了SSL Echo客户端示例,但似乎服务器端也应该是Qt WebSocket。

Q1) How to make secure connection using Qt from client side? Q1)如何使用客户端的Qt进行安全连接?

NOTE: server side is configured for secure connection already. 注意:服务器端已配置为已进行安全连接。

Q2) Server side is not Qt Code and client side is Qt. Q2)服务器端不是Qt代码,客户端是Qt。 does it in secure web socket connection? 它是否在安全的Web套接字连接中? (ie server Socket and client Socket are independent of programming Language for connection or not?) (即服务器套接字和客户端套接字是否独立于编程语言以进行连接?)

NOTE: i'm able to connect with same server using none secure connection. 注意:我可以使用无安全连接与同一服务器连接。

I did found solution after all, 我毕竟找到了解决方案,

Before I open connection to the remote server using this line, 在使用此行打开与远程服务器的连接之前,

wsocket.open(serverURL); wsocket.open(serverURL使用);

I added QSslConfiguration and ignore ssl Error for self signed certificate for development , of course i will correc that in Production. 我添加了QSslConfiguration并忽略了用于开发的自签名证书的ssl错误,当然我将在生产中更正。

QSslConfiguration sslConfiguration = wsocket.sslConfiguration();
sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyPeer);
wsocket.setSslConfiguration(sslConfiguration);
wsocket.ignoreSslErrors();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM