Если у вас аллергия на SSL, используйте SSH.Но принципы идентичны.Обмен ключами осуществляется через асимметричный алгоритм (RSA, Diffie-Hellman ...), который затем используется для симметричного шифрования и MAC.Конструкция тонкая, поэтому настоятельно рекомендуется использовать существующий протокол, такой как SSL или SSH, где были рассмотрены сложные детали.
В обоих протоколах первичная фаза происходит свзаимная аутентификацияЧасть «сервер» (в модели соединения «клиент» - это тот, кто инициирует соединение, а сервер - другая машина) должен представить свой асимметричный ключ способом, «достаточно убедительным» для клиента (клиент хочет быть уверен, что он общается с нужным сервером, а не с кем-то другим, кто имитирует сервер).В SSL этот ключ является частью сертификата X.509.Когда SSL используется веб-браузером, этот сертификат считается правильным, если браузер может проверить его по известному набору «якорей доверия», также известным как «корневые сертификаты».Эти якоря управляются некоторыми организациями (например, Verisign), которые заключили сделку с производителем браузеров;Суть в том, что если вам нужен сертификат, который может быть проверен на соответствие этим корневым сертификатам, вы должны получить его у одного из менеджеров привязки, и они не будут делать это бесплатно.
Обратите внимание, хотято, что проверка по известному набору якорей доверия - это вещь браузера.Поскольку это для вашего собственного проекта, вы можете создать свой собственный якорь доверия и свои собственные сертификаты. OpenSSL может помочь вам в этом.Еще проще: используйте «фиктивный» сертификат для сервера, также известный клиенту, и клиент просто проверяет, что сервер отправляет «ожидаемый» сертификат.
Более простая модель - это то, что делает SSH.В SSH каждый клиент должен поддерживать свою собственную базу данных «известных ключей сервера» (в $HOME/.ssh/known_hosts
в реализациях Unix).Клиент будет отображать достаточное количество предупреждений при подключении к новому серверу и даже более крупные предупреждения, если подключен известный сервер, но не использует ранее записанный ключ.Для многих ограниченных проектов это подходящая модель.Суть сертификатов X.509 с доверенными якорями заключается в том, чтобы клиенты могли безопасно идентифицировать множество серверов, даже серверов, которые еще не существовали на момент развертывания клиентского программного обеспечения.Если вы управляете и клиентом, и сервером, то вам это не нужно.
То, что SSH реализует по умолчанию, кажется, лучше соответствует тому, что вам нужно, но реализации SSL более распространены (в частности, я полагаю, что в.NET, готов к использованию).Что вам нужно сделать, это перехватить часть «проверки сертификата сервера» и заменить ее своей собственной простой функцией сопоставления: «Это именно тот байт-байтовый сертификат, который я ожидал?».