我正在创建应该能够与之连接的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套接字连接? (即服务器套接字和客户端套接字是否独立于编程语言进行连接?)
注意:我可以使用不安全的方式连接到同一服务器 连接。
答案 0 :(得分:0)
我确实找到了解决方法,
在我使用此行打开与远程服务器的连接之前,
wsocket.open(serverURL);
我添加了QSslConfiguration并忽略了用于开发的自签名证书的ssl错误,当然我会在生产中更正该错误。
QSslConfiguration sslConfiguration = wsocket.sslConfiguration();
sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyPeer);
wsocket.setSslConfiguration(sslConfiguration);
wsocket.ignoreSslErrors();