crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
mezmay
  опции профиля:
сообщение 11.12.2013, 12:09
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Раньше на обычных сокетах (QTcpSocket) написал клиент-серверный чат, в общем-то чисто для саморазвития и изучения технологий. Там база данных, потоки, регистриция и авторизация и т.д.
Теперь хочу сделать соединения защищенными, применив QSslSocket.

Собрал последний OpenSSL, сгенерировал ключ и сертификат:

QString program = "openssl/openssl";
QString arg("req -x509 -newkey rsa:1024 -keyout server.key -nodes -days 365 -out server.crt -batch");
QStringList arguments = arg.split(' ', QString::SkipEmptyParts);
        
QProcess prg(this);
int ret = prg.execute(program, arguments);


Тестовый простой сервер:
Раскрывающийся текст
void CMyServer::incomingConnection( qintptr handle )
{
    QSslSocket *socket = new QSslSocket;

    if (socket->setSocketDescriptor(handle)) 
    {
        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, SIGNAL(encrypted()), this, SLOT(ready()));
                connect(socket, SIGNAL(sslErrors(QList<QSslError>)),
                    this, SLOT(sslErrors(QList<QSslError>)));        
                connect(socket, SIGNAL(readyRead()),
                    this, SLOT(onReceive()));

                socket->startServerEncryption();
            }
        }        
        else
        {
            delete socket;
        }
    } 
    else 
    {
        delete socket;
    }
}


клиент, еще проще, как в примере:
Раскрывающийся текст
QSslSocket *socket = new QSslSocket(this);
connect(socket, SIGNAL(encrypted()), this, SLOT(ready()));
connect(socket, SIGNAL(sslErrors(QList<QSslError>)),
    socket, SLOT(ignoreSslErrors()));
connect(socket, SIGNAL(readyRead()),
    this, SLOT(onReceive()));

socket->connectToHostEncrypted("MyWorkComp-i7", 12345);

Тут, как видно, вставлено игнорирование SSL ошибок у клиента, и рукопожатие происходит и дальше можно передавать данные.

Вопрос: стоит ли делать так? Или надо обязательно генерировать и подписывать сертификаты для каждого клиента? Тогда как их раздавать?

Сообщение отредактировал mezmay - 11.12.2013, 12:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 11.12.2013, 17:37
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Вот нашел
статью на habranabr
но так и не понял, какой минимальный набор всех этих ключей-сертификатов запросов мне нужен...
Пока что понимаю, что вроде как должен быть сертификат на сервере, содержащий имя сервера и подписанный на корневой сертификат. Куда устанавливать корневой сертификат и что делать на клиенте пока непонятно...

Сообщение отредактировал mezmay - 11.12.2013, 17:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
call_me_Frank
  опции профиля:
сообщение 12.12.2013, 19:19
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 20.10.2010
Пользователь №: 2129

Спасибо сказали: 0 раз(а)




Репутация:   0  


если работать без сертификатов и подключаться к серверу с помощью QSslSocket, используя шифрованное подключение (SSL), будет ли это означать, что я работаю с сервером по протоколу HTTPS? вопрос возник после просмотра статьи...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 12.12.2013, 20:02
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


По идее, если происходит рукопожатие, то да:
void QSslSocket::encrypted() [signal]
This signal is emitted when QSslSocket enters encrypted mode. After this signal has been emitted, QSslSocket::isEncrypted() will return true, and all further transmissions on the socket will be encrypted.

но насколько это правильно я пока не знаю
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 18.2.2025, 17:03