LINUX.ORG.RU

проблема с qsslsocket

 , , ,


0

1

Здравствуйте, у меня возникла проблема с QSslSocket. Клиенту удается подключиться, но отправлять сообщение клиенту удается только до строчки sslSocket->startServerEncryption(); Ниже представлен код сервера:

#include "qsslserverclass.h"
#include <QDebug>
QSSLServerClass::QSSLServerClass(int portServ, QObject *parent)
        : QTcpServer(parent)
{
    portServer = portServ;
}
 
bool QSSLServerClass::startServer()
{
    if(!listen(QHostAddress::Any,portServer)){
        qDebug()<<"error";
        close();
        return false;
    } else{
        return true;
    }
}
 
void QSSLServerClass::incomingConnection(qintptr handle)
{
    qDebug()<<"incomingConnection on socket:"<< handle;
    emit(signalNewConnection(handle));
   // new QSSLServerConnectionClass(handle, this);
     servclass = new QSSLServerConnectionClass(handle,this);
}
 
void QSSLServerClass::slotSendMes(QString str)
{
    qDebug()<<"2"<<str;
    servclass->SendMes(str);
}
 
QSSLServerConnectionClass::QSSLServerConnectionClass(quint16 socketNum, QObject *parent)
    : QObject(parent)
{
   sslSocket = new QSslSocket(this);
   sslSocket->setSocketDescriptor(socketNum);
 
   QFile certFile(QStringLiteral(":/certificate.pem"));//Написать свои?
   QFile keyFile(QStringLiteral(":/private.key"));// Или оставить эти? Или заказать на сайте бесплатные?
   certFile.open(QIODevice::ReadOnly);
   keyFile.open(QIODevice::ReadOnly);
   sslCertificate = new QSslCertificate(&certFile);
   sslKey = new QSslKey(&keyFile,QSsl::Rsa);
   certFile.close();
   keyFile.close();
 
   sslSocket->setLocalCertificate(*sslCertificate);
   sslSocket->setPrivateKey(*sslKey);
   sslSocket->setProtocol(QSsl::AnyProtocol);
 
   connect(sslSocket,SIGNAL(connected()),this,SLOT(slotConnected()));
   connect(sslSocket,SIGNAL(encrypted()),this,SLOT(slotReadyRead()));
   connect(sslSocket,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));
   connect(sslSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slotSSLErrors(QAbstractSocket::SocketError)));
/////Отправляет
QByteArray array;
  QString str = "[server]>> Hello my friend\n";
   array.append(str);
   sslSocket->write(array);
 
   sslSocket->startServerEncryption();
 
/////уже не отправляет
QByteArray array;
  QString str = "[server]>> Hello my friend\n";
   array.append(str);
   sslSocket->write(array);
}
В чем может быть проблема? Хочется узнать ваше мнение и советы, спасибо))

В чем может быть проблема?

Ошибка хэндшейка может быть? openssl s_client может подключиться?

советы

Не писать серверы на Qt :)

annulen ★★★★★
()

советы

Не использовать QString при работе с API, принимающими/возвращающими QByteArray, за исключением случаев, когда требуется преобразование кодировок

annulen ★★★★★
()

советы

Использовать connect в стиле Qt 5, чтобы ошибки обнаруживались во время компиляции

annulen ★★★★★
()
Ответ на: комментарий от annulen
openssl s_client -connect 127.0.0.1:2525
CONNECTED(00000003)
139956316246464:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../ssl/record/ssl3_record.c:252:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 176 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1545725262
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no

Если подключаться в клиенте через socket->connectToHostEncrypted(«127.0.0.1»,2525); то сервер выдает такую ошибку сразу после подключения QAbstractSocket::RemoteHostClosedError

hellomyfriend
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.