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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с QSslSocket, протоколы SSL и TLS  (Прочитано 4428 раз)
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 работает. Ошибки никакие не выдаются
« Последнее редактирование: Январь 17, 2014, 17:29 от mezmay » Записан
OKTA
Гость
« Ответ #1 : Январь 30, 2014, 17:39 »

Заглянул сюда и увидел, что у последних протоколов и не стоит никакое VALUE  Непонимающий
http://qt-project.org/doc/qt-5/qssl.html#SslProtocol-enum
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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