Russian Qt Forum

Qt => Работа с сетью => Тема начата: mezmay от Январь 17, 2014, 09:36



Название: Работа с QSslSocket, протоколы SSL и TLS
Отправлено: mezmay от Январь 17, 2014, 09:36
Windows 7, Qt5, собран последний openssl (но в path не прописывал).

Сгенерировал корневой сертификат, локальный сертификат для сервера, ключ, всё подписано как надо:
Код:
/* корневой ключ */
genrsa -out rootCA.key 2048
 
/* корневой сертификат */
req -x509 -new -key rootCA.key -days 10000 -out rootCA.crt -batch

/* Генерируем ключ */
genrsa -out server.key 2048

/* Создаем запрос на сертификат */
req -new -key server.key -out server.csr -subj /C=RU/ST=RnD/CN=my_host_name -batch

/* подписать запрос на сертификат нашим корневым сертификатом */
x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

Создаю простые программки клиента и сервера.
Вот так примерно сервер:
Код:
void CBerServer::incomingConnection( qintptr handle )
{
    socket = new QSslSocket;

    // задаем дескриптор сокету
    if(socket->setSocketDescriptor(handle))
    {
        socket->setProtocol(QSsl::TlsV1_2);

        QFile root_file("rootCA.crt");
        root_file.open(QIODevice::ReadOnly);
        QSslCertificate root_cert(&root_file);

// задаем корневой сертификат
        socket->addCaCertificate(root_cert);

        QFile crt_file("server.crt");
        if(crt_file.open(QIODevice::ReadOnly))
        {
            QByteArray crt_data = crt_file.readAll();
            crt_file.close();
            QSslCertificate cert(crt_data);

// проверяем, не истек ли локальный сертификат
            if(cert.expiryDate() >= QDateTime::currentDateTime())
            {
// приватный ключ и локальный сертификат
                socket->setPrivateKey("server.key");
                socket->setLocalCertificate("server.crt");        
// соединяем стандартные сигналы со слотами
                connect(socket, &QSslSocket::encrypted, this, &CBerServer::ready);
                connect(socket, SIGNAL(sslErrors(QList<QSslError>)),
                    this, SLOT(onSslErrors(const QList<QSslError> &)));        
                connect(socket, SIGNAL(readyRead()),
                    this, SLOT(onReceive()));

/* запускаем процесс "рукопожатия",
т.е. установки защищенного соединения */
                socket->startServerEncryption();
            }
        }        
        else
        {
            delete socket;
        }
    }
}
Ну и на клиенте совсем просто:
Код:
QSslSocket *socket = new QSslSocket(this);

QFile root_file("rootCA.crt");
root_file.open(QIODevice::ReadOnly);
QSslCertificate root_cert(&root_file);

// Тот же корневой сертификат, и далее стандартно
socket->addCaCertificate(root_cert);

connect(socket, SIGNAL(encrypted()), this, SLOT(ready()));
bool bb = connect(socket, SIGNAL(sslErrors(QList<QSslError>)),
this, SLOT(sslErrors(const QList<QSslError> &)));
connect(socket, SIGNAL(readyRead()),
    this, SLOT(onReceive()));

socket->setProtocol(QSsl::TlsV1_2);
socket->connectToHostEncrypted("localhost", 12345);
   

Проблема: не создается защищенное соединение по протоколам TLS 1.1 и TLS 1.2. По протоколам SSL 3 и TLS 1.0 работает. Ошибки никакие не выдаются


Название: Re: Работа с QSslSocket, протоколы SSL и TLS
Отправлено: OKTA от Январь 30, 2014, 17:39
Заглянул сюда и увидел, что у последних протоколов и не стоит никакое VALUE  ???
http://qt-project.org/doc/qt-5/qssl.html#SslProtocol-enum