Я понимаю, что с помощью цифровых подписей достигается отсутствие отказов и целостности, но это еще не подтвержденная проверка подлинности.Аутентификация сервера с цифровыми сигнатурами
Я разрабатываю приложение Client-Server на C#, которое должно быть способным к аутентификации с помощью цифровых сертификатов и цифровых подписей. Я знаю, как проверить достоверность и целостность Подписи (с SignedCms.CheckSignature()), но как это аутентифицирует какую-либо из частей?
Например:
- клиент запрашивает сервер для цифровой подписи,
- Клиент получает подпись и проверяет его,
- Если проверка прошла успешно, по-прежнему.
Клиент может стать жертвой нападения «человек в середине» и получить действительную подпись на шаге 2. Проверка будет успешной, но клиент не будет разговаривать с правильным сервером.
Что мне не хватает?
Что делать, если человек в середине блокирует подпись, поступающую с сервера, и отправляет клиенту всю новую цифровую подпись с полностью действующим сертификатом, выданным доверенным ЦС? –
Это становится более интересным. В SSL вы должны проверить имя сертификата, чтобы убедиться, что он обрабатывает адрес, к которому вы подключаетесь.Вы полагаетесь на SSL-сертификаты, гарантируя, что они проверили, что сертификат выдается лицу, которому принадлежит это полное доменное имя. А затем публикуются списки отзыва в случае, если это не так. В других сценариях вы будете искать имя машины и, возможно, отпечаток сертификата, который изменится или проведет проверку всей цепочки, что было бы иначе, если сертификат был выпущен другим ЦС. Сказал вам, я упростил это :) – blowdart
Если я хорошо понял, аспекты, касающиеся среды, отличной от ssl, подразумевают, что клиент уже имеет правильную информацию о сервере (например, отпечаток пальца). Я мог только сказать, изменился ли он, если я уже правильный отпечаток отпечатка.) Что произойдет, если он впервые подключится к серверу, и нет никакой предыдущей доверенной информации для сравнения? –