LINUX.ORG.RU

QT + SLL


0

1

Создал SSL-сервер SslServer:: public QTcpServer

void SslServer::incomingConnection(int handle)
{
    socket = new QSslSocket(this);
    if (socket->setSocketDescriptor(handle))
    {
        qDebug()<<"yes\t"<<socket;
        connect(socket, SIGNAL(encrypted()), this, SLOT(on_encrypted()));
        connect(socket, SIGNAL(readyRead()), this, SLOT(on_dataRead()));
        connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(on_sslErrors(QList<QSslError>)));
        connect(socket,SIGNAL(disconnected()),this,SLOT(slotTCPServerDisconnected()));
        connect(socket,SIGNAL(readyRead()),this,SLOT(slotTCPServerReadyRead()));
        socket->setPrivateKey("/opt/terminus/share/cert/server.key", QSsl::Rsa);
        socket->setLocalCertificate("/opt/terminus/share/cert/server.crt");

        socket->startServerEncryption();
        emit message("New connection...\r\n");
        foreach(QSslError err, socket->sslErrors())
        {
            emit message(QString(err.errorString()).append("\r\n"));
        }

    }
    else delete socket;
}

при попытке подключиться

   socket = new QSslSocket();
    connect(socket, SIGNAL(connected()), SLOT(waitForGreeting()));
    connect(socket, SIGNAL(readyRead()), SLOT(readResponse()));
    connect(socket, SIGNAL(connectionClosed()), SLOT(quit()));
    connect(socket, SIGNAL(delayedCloseFinished()),SLOT(quit()));
    socket->setPrivateKey("/opt/terminus/share/cert/server.key", QSsl::Rsa);
    socket->setLocalCertificate("/opt/terminus/share/cert/server.crt");
    socket->connectToHost("127.0.0.1", 3428);

    if (!socket->waitForEncrypted()) {
     qDebug() << socket->errorString();
    }
    else
    {
        socket->write("GET / HTTP/1.0\r\n\r\n");
        while (socket->waitForReadyRead())
            qDebug() << socket->readAll().data();
    }

выдается

"Unknown error"

На сервере никаких ошибок не выводится. Что я делаю неправильно?


Ответ на: комментарий от kryuch
cket->setPrivateKey("/opt/terminus/share/cert/server.key", QSsl::Rsa);
socket->setLocalCertificate("/opt/terminus/share/cert/server.crt");

А вот это у тебя в клиенте?

erfea ★★★★★
()
QSslSocket *ssl = new QSslSocket();
ssl->ignoreSslErrors();
ssl->connectToHostEncrypted("127.0.0.1", 3428);
ssl->waitForEncrypted();

По идее это делается как-то так. Со стороны сервака перепроверь 10 раз что пути к ключу с сертификатом верные (молча не пашет если не находит). Ну и при самоподписанном сертификате «QSslSocket::ignoreSslErrors()» надо не пробовать, а юзать в обязательном порядке.

erfea ★★★★★
()
Ответ на: комментарий от erfea
    socket = new QSslSocket();

    socket->setPrivateKey("/opt/terminus/share/cert/server.key", QSsl::Rsa);
    socket->setLocalCertificate("/opt/terminus/share/cert/server.crt");

    socket->ignoreSslErrors();
    socket->connectToHost("127.0.0.1", 3428);

    if (!socket->waitForEncrypted()) {
     qDebug() << socket->errorString();
    }

все также. waitForEncrypted() упорно возвращает false. Пути к сертификатам верные.

kryuch
() автор топика
Ответ на: комментарий от erfea

А, что, их разве на клиенте не надо дергать?

    socket = new QSslSocket();
    socket->ignoreSslErrors();
    socket->connectToHost("127.0.0.1", 3428);
    if (!socket->waitForEncrypted()) {
     qDebug() << socket->errorString();
    }

Ситуация та-же :(

kryuch
() автор топика
Ответ на: комментарий от erfea

Да, действительно, не заметил. Большое спасибо, дело наконец-то двинулось, теперь

"The host name did not match any of the valid hosts for this certificate" 

Полагаю, что-то я с сертификатами напутал

kryuch
() автор топика
Ответ на: комментарий от kryuch

А соединение устанавливается? Есть у меня подозрение что он просто ругается...

erfea ★★★★★
()
Ответ на: комментарий от alex_custov

Да, вот такая штука

connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(on_sslErrors(QList<QSslError>)));
помогла, начало чего-то работать

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