Как правильно сделать авторизацию и шифрование для TCP соединения?
====================================================================

 Здравствуйте.  

Пишу на Qt/C++ простейший TCP сервер. Необходимо отправлять команды серверу.  

Серверов будет два и на каждом будет запускаться этот сервер и друг другу передавать команды.  

Но перед этим надо авторизовать второго сервера (tcp/ip сессию) и шифровать соединение, чтобы нельзя было проснифить трафик.  

Какие есть уже решения для этого? Методы, способы?  

Для шифрования соединения это наверно банально SSL/TLS. А вот с авторизацией не знаю как проще. 

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

При успешном рукопожатии у нас есть сессионный ключ, которым шифруется трафик.  

Так же в целях безопасности я бы ограничил поддержку только протокола TLS1.3, учитывая, что и клиент и сервер - наши приложения, проблем точно не возникнет 

> Для шифрования соединения это наверно банально SSL/TLS.

  

Авторизацию так же этим. 

 Банально: разделённый секрет (ключи для серверов, пользователей и для шифрования трафика).  

Ключ - это формируемый динамически набор символов в конкретный момент времени, который зависит от предыдущего ключа, на основе некой связующей формулы, меняющей предыдущий ключ.  

  

Стартовые ключи - известны только серверам и клиентам, затем - постоянное обновление счётчика использования ключа на обеих сторонах. 

 Для TCP соединения - авторизация и шифрование не делаются. Они работают поверх TCP - например, SSL.  

  

Я советую смотреть в сторону SSh - как там это сделано. Уверен, что в SSh уже сделано всё, что Вам хочется; а также то, что Вам пока что не хочется, но потребуется/будет полезно.  

Поищите на Хабре статьи про SSh. Сначала смотрите на функциональность - что он может. Потом - копайте, как это делается.  

Ещё одно направление поиска - PuTTY. Это тот же SSh, просто под Windows. Возможно, там доки лучше зайдут.  

  

SSh - продукт открытый, код можно тянуть свободно.  

  

Хорошее решение - запихнуть Вашу TCP-сессию в SSh-туннель, который сделает и шифрование, и авторизацию.