Как реализовать безопасную связь сокетов в приложении C ++ с помощью Winsock?

Я пытаюсь реализовать безопасную связь между сервером и клиентом в C ++. Ограничение состоит в том, что и клиент, и сервер должны работать в Windows и должны быть на C ++. Это для исследовательского проекта, над которым я работаю в моем университете.

До сих пор я обнаружил, что SChannel — лучший вариант, но документация чрезвычайно запутанная, и я не могу найти какие-либо руководства / руководства по его использованию. Я уже посмотрел на эту ссылку https://docs.microsoft.com/en-us/windows/desktop/secauthn/creating-a-secure-connection-using-schannel но до сих пор не понимаю, как заставить его работать. Может ли кто-нибудь провести меня через это, если это лучший способ?

Я также изучил использование SSLStream с использованием CLR для запуска .net внутри приложения c ++. Однако я не могу использовать это, потому что клиентское приложение является многопоточным и потоки не могут быть использованы с CLR.

У меня уже есть фиктивный клиент и сервер, настроенный для связи между ними, я просто пытаюсь защитить и зашифровать эту связь.

Любая помощь очень ценится!

0

Решение

Какую бы библиотеку SSL вы не выбрали, есть несколько вещей, которые вы должны знать как новичок в этой области:

Реализации сервера и клиента в конечном итоге будут выглядеть совершенно по-разному.

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

Сертификат состоит из приватной части и публичной части. Публичная часть должна перейти к клиенту и будет использоваться для проверки соединения. Когда вы используете что-то вроде SChannel, сертификаты (частные и публичные) должны быть установлены в хранилищах сертификатов сервера и клиента соответственно.

SChannel не отправляет и не получает данные для вас. Итак, ядром вашей реализации будет: когда в сети есть данные: прочитайте зашифрованный текст из сокета и запишите в SChannel. Прочитайте открытый текст из SChannel (если есть) и перейдите к приложению. Когда у приложения есть данные для отправки, получите открытый текст из приложения и передайте его в SChannel. Получите полученные буферы зашифрованного текста из SChannel и запишите в сокет.

буферы из интернета могут быть частичными, а переговоры и повторные переговоры означают, что нет никакого соотношения 1: 1 для передачи данных в SChannel и их вывода.

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

Очевидно, не пишите одновременно и клиент, и сервер: начните с вашего клиента на сервере https.

Это общая схема процесса — то, что смутило меня, когда я впервые столкнулся с SSL, и почему ни один из примеров не оказался настолько простым, как я надеялся.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]