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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSslSocket, Шифрование, сертификаты и всё такое прочее  (Прочитано 3740 раз)
Narsil
Гость
« : Июнь 24, 2010, 14:52 »

Доброго времени суток!

Собственно говоря, вопросы у меня в большей степени по SSL вообще, но буду задавать их применительно к QSslSocket

Мне необходимо установить безопасное соединение между клиентом и сервером (оба на моей совести). Проверка подлинности мне не особо нужна, она у меня будет осуществляться другими способами.

Почитал я доки, сгенерировал сертификат x509 и private RSA key. Сделал пробный сервер, в котором на каждое входящее соединение делается
Код
C++ (Qt)
socket->setPrivateKey("/tmp/certs/server.key");
socket->setLocalCertificate("/tmp/certs/server.crt");

Взял пример из Qt network/securesocketclient. Делаю коннект на свой сервер, вижу свой сертификат, разрешаю его. Ну и вроде как защищённое соединение установлено.

Я вот только что-то не очень понимаю, как там шифрование-то проиходит? На сервере-то ладно, у него есть приватный ключ, а публичный наверно лежит в сертификате (я правильно понимаю? нет?). Но у клиента-то никакого ключа нет своего, чем он шифрует-то?

Почитал ещё. Узнал, что после принятия сертификата, клиент генерирует какое-то рандомное число, шифрует его открытым ключом сервера и посылает на сервер. Сервер дешифрует это сообщение своим приватным ключом, получает это самое рандомное число и оно уже используется для шифрования.
Я правильно всё понял?

Если да, то снова возникают вопросы. Если при шифрации этого случайного числа используется RSA (ну, приватный ключ-то RSAшный), то какой алгоритм используется для шифрации остальных сообщений? Где это указать? Где указать размер этого самого случайного числа?

И наверно последняя пара вопросов. Можно ли сделать так, чтобы и у клиента и у сервера были бы своя пара RSAшных ключей, при установке соединения они бы ими обменялись и далее шифровали\дешифровали с их помощью? Мне кажется это более логичным, нежели какое-то случайное число и неизвестный алгоритм (но я готов выслушать и другие точки зрения). Если можно, как это сделать? Всмысле какой код необходимо написать? Какие\как сертификаты\ключи сгенерировать для обеих сторон?

Заранее благодарен за помощь.
Записан
OKTA
Гость
« Ответ #1 : Февраль 07, 2014, 15:19 »

Не поздновато отвечаю?)) Клиенту в данном случае не нужен закрытый ключ. Закрытый ключ, а точнее сертификат, ему нужен только в случае, если серверу так же необходимо проверить подлинность клиента. Трафик шифруется между сервером и клиентом с помощью общего секрета, который генерируется посредством алгоритма обмена ключами, типа Diffie-Hellman, RSA, DSA. Случайное число, которое отправляет клиент, зашифровав открытым ключом сервера - это предварительный общий секрет для выработки общего секрета. И фишка вся не в том, что у клиента и сервера свои RSA-ключи(они-то служат в основном для проверки подлинности), а в алгоритме выработки общего секрета без передачи его по сети)
« Последнее редактирование: Февраль 07, 2014, 15:26 от OKTA » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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