Как безопасно передавать данные по сети?

У меня есть сервер и клиент написанные на си которые используют протокол tcp.

Вопрос: Как мне передавать эти данные через обыкновенные сокеты безопасно, чтобы клиент и сервер использовали асимметричное шифрование, может какой-то протокол поверх tcp впихнуть или все-таки вручную легче шифровать?


Ответы (1 шт):

Автор решения: Sergei Kirjanov

Для TLS можно поднять пару haproxy (tcp->tls и tls->tcp).

Соответственно TCP клиенты идут на localhost, и TCP серверa слушают на localhost-е

Минусы:

  • возможна пара мс задержки
  • если на localhost кто-то забрался ... (то у нас уже всё плохо)
  • если клиент распространяется как инсталлятор, нужно уточнить возможность поставки/работы haproxy/stunnel для конкретной платформы

Плюсы:

  • не надо разбираться, как работают разные библиотеки на множестве платформ при написании софта.
  • не надо разбираться, как персобрать софт, который написал Вася 5 лет назад с новой версией библиотеки без дырок.
  • можно поставить несколько серверов на разных платформах на одном внешнем адресе:порту -- SNI.
  • можно поставить несколько инстансов сервера
  • легко интегрировать сервер, который уже написан с TCP

клиент:

global
  tune.ssl.default-dh-param 2048
defaults
  timeout connect 5s
  timeout client  3d
  timeout server  3d
  mode tcp

listen listen_$name
  bind $bind
  server s_$name $gate_addr ssl verify none sni str("$name.$sni_postfix")

сервер:

...
frontend fe443
  bind :443 ssl crt-list /etc/letsencrypt/haproxy/list.txt
  use_backend be_$name if { ssl_fc_sni -m dom $name }

backend be_$name
  server s_$name $to

($x заменяйте, сроки с ним можно размножать)


Вниманее, в примере сертификаты не проверяются: server ... verify none. Соответственно проверку серверного сертификата лучше включить.

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

→ Ссылка