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

时间:2019-06-08 07:10:00

标签: c++ qt ssl websocket

  

我正在创建应该能够与之连接的Qt应用程序   使用安全连接的服务器(即wss://xxx.xxx.xxx.xxx:8080),   应用程序在非安全连接下正常运行(即   ws://xxx.xxx.xxx.xxx:8443)。

我正在使用的协议是WebSocket。我已使用库进行连接。

  

基于Qt 5.5.0(MSVC 2013,32位)的Qt Creator 3.4.2(开源)

QsslSocket :: supportsSsl()返回 false ,然后发现我丢失了openssl库文件( libeay32.dll,ssleay32.dll ),然后我将这些文件放在应用程序的路径中,然后再次运行代码,现在QSslSocket :: supportsSsl()返回 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;
}

如何解决这个问题,任何人都知道如何连接安全的Web套接字。我确实检查了SSL Echo Client Example,但似乎服务器端也应该是Qt WebSocket。

  

Q1)如何从客户端使用Qt建立安全连接?

     

注意:服务器端已配置为安全连接。

     

Q2)服务器端不是Qt代码,客户端是Qt。做它   安全的Web套接字连接? (即服务器套接字和客户端套接字是否独立于编程语言进行连接?)

     

注意:我可以使用不安全的方式连接到同一服务器   连接。

1 个答案:

答案 0 :(得分:0)

我确实找到了解决方法,

在我使用此行打开与远程服务器的连接之前,

  

wsocket.open(serverURL);

我添加了QSslConfiguration并忽略了用于开发的自签名证书的ssl错误,当然我会在生产中更正该错误。

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