簡體   English   中英

如何在Qt c ++中使用Secure WebSocket連接服務器

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

我正在創建應該能夠使用安全連接與服務器連接的Qt應用程序(即wss://xxx.xxx.xxx.xxx:8080),應用程序正常工作,沒有安全連接(即ws:// xxx。 xxx.xxx.xxx:8443)。

我正在使用的協議是WebSocket。 我用過庫來連接。

Qt Creator 3.4.2(opensource)基於Qt 5.5.0(MSVC 2013,32位)

QsslSocket :: supportsSsl()返回false ,然后發現我缺少openssl庫文件( libeay32.dll,ssleay32.dll )然后我將這些文件放在我的應用程序的路徑中並再次運行代碼QSslSocket :: supportsSsl( )正在返回真實 但是,當我嘗試連接websocket時,它顯示出以下錯誤。

connect(&wsocket,SIGNAL(error(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客戶端示例,但似乎服務器端也應該是Qt WebSocket。

Q1)如何使用客戶端的Qt進行安全連接?

注意:服務器端已配置為已進行安全連接。

Q2)服務器端不是Qt代碼,客戶端是Qt。 它是否在安全的Web套接字連接中? (即服務器套接字和客戶端套接字是否獨立於編程語言以進行連接?)

注意:我可以使用無安全連接與同一服務器連接。

我畢竟找到了解決方案,

在使用此行打開與遠程服務器的連接之前,

wsocket.open(serverURL使用);

我添加了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