Russian Qt Forum
Ноябрь 24, 2024, 01:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSslSocket сервер & клиент  (Прочитано 5292 раз)
RedDog
Гость
« : Февраль 16, 2011, 12:18 »

Сервер, согласно хелпу:
Код:
class SslServer : public QTcpServer
{
    Q_OBJECT
public:
    explicit SslServer(QObject *parent = 0);
private:
    void incomingConnection(int handle);
    QSslSocket *socket;
signals:
    void message(QString);
public slots:
    void on_encrypted();
    void on_dataRead();
};

Код:
SslServer::SslServer(QObject *parent) :
    QTcpServer(parent)
{
    listen(QHostAddress::Any, 3344);
}
void SslServer::incomingConnection(int handle)
{
    socket = new QSslSocket(this);
    if (socket->setSocketDescriptor(handle))
    {
        connect(socket, SIGNAL(encrypted()), this, SLOT(on_encrypted()));
        connect(socket, SIGNAL(readyRead()), this, SLOT(on_dataRead()));
        socket->startServerEncryption();
        emit message("New connection...\r\n");
        foreach(QSslError err, socket->sslErrors())
        {
            emit message(QString(err.errorString()).append("\r\n"));
        }

    }
    else delete socket;
}
void SslServer::on_dataRead()
{
    QByteArray arr = socket->readAll();
    emit message(QString(arr).append("\r\n"));
}
void SslServer::on_encrypted()
{
    emit message(QString("Encrypted... \r\n"));
}
Подсоединяюсь клиентом:
Код:
    socket = new QSslSocket(this);
    connect(socket, SIGNAL(encrypted()), this, SLOT(on_encrypted()));
    connect(socket, SIGNAL(readyRead()), this, SLOT(on_dataRead()));
    socket->connectToHostEncrypted("localhost", 3344, QIODevice::ReadWrite);
    socket->waitForEncrypted();
    socket->write(QString("Hello").toUtf8());
Получаю:
Цитировать
The remote host closed the connection
Что не так? В слот on_encrypted() не заходит.
Про сертификаты и ключи читал, формировал, указывал, но толку нету. Да и не нужны по большому счету мне подтверждения подлинности, нужен только протокол SSL.
Записан
Robotex
Гость
« Ответ #1 : Февраль 16, 2011, 13:39 »

SSL без сертификатов работать не будет. И если сертификаты генерировали сами, используйте ignoreSslErrors у клиента.
Записан
RedDog
Гость
« Ответ #2 : Февраль 16, 2011, 14:40 »

Не помогает
при соединении Unknown error
Записан
CuteBunny
Гость
« Ответ #3 : Февраль 18, 2011, 09:59 »

Если не нужно проверять сертификаты - void QSslSocket::setPeerVerifyMode ( QSslSocket::PeerVerifyMode mode ) QSslSocket::VerifyNone - может поможет

p.s.: Надеюсь qt собран с openssl?
« Последнее редактирование: Февраль 18, 2011, 10:03 от CuteBunny » Записан
RedDog
Гость
« Ответ #4 : Февраль 18, 2011, 11:14 »

Дело оказалось в:
1. Неверно был сформирован сертификат - QSslSocket::localSertificate()::isNull() возвращал true, сделал командой
Код:
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout primary.key -out localSertificate.pem
стало нормально подгружать, но не до конца решило проблему, ибо:
2. одиночный вызов ignoreSslErrors() не решает проблему, пришлось соединять sslErrors(QList<QSslError>)  с ignoreSslErrors()
Код:
connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(on_sslErrors(QList<QSslError>)));
и на сервере и на клиенте такое прописал, заработало
Записан
CuteBunny
Гость
« Ответ #5 : Апрель 29, 2011, 07:18 »

Код
C++ (Qt)
rsa:1024

Длина ключа больше 128 бит - это не нарушение закона? Можно ли мне также делать, как автор, если у меня нету лицензии ФАПСИ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.095 секунд. Запросов: 20.