Я достаточно хорошо понимаю PKI с концептуальной точки зрения - т.е. частные ключи / открытые ключи - математика, стоящая за ними, использование хэша и шифрования для подписи сертификата, цифровая подпись транзакций или документов и т. Д. Я также работал над проектами, в которых openssl Библиотеки C использовались с сертификатами для обеспечения связи и аутентификации. Я также очень хорошо знаком с инструментами командной строки openssl.
Тем не менее, у меня очень мало опыта работы с веб-проектами с поддержкой PKI, и поэтому я пытаюсь разработать и написать собственный проект для лучшего понимания этого.
Требования
Это сайт для банка. Всем пользователям интернет-банка разрешается использовать любой сертификат, выданный несколькими известными центрами сертификации (verisign, Thawte, entrust и т. Д.). Банк не несет ответственности за приобретение сертификатов для пользователя. Эти сертификаты будут использованы для аутентификации на сайте банка. Платформы / ОС и т. Д. Все еще не исправлены.
дизайн
Мне было интересно, что является лучшим способом сделать аутентификацию.
Я видел, что у Apache есть способ включить двухсторонний ssl - в этом случае, я думаю, что переход на веб-сайт автоматически запросит сертификат у пользователя. Но я не уверен, что этого достаточно, потому что кажется, что он проверяет только то, подписан ли сертификат доверенным центром сертификации, а также может ли он попасть в белый список строк темы сертификатов и т. Д. Но этого недостаточно. для банковского дела, потому что вы должны иметь возможность связать идентификатор пользователя банка с сертификатом.
Кажется, у IIS есть способ, которым я могу сохранить сертификат для каждого пользователя в Active Directory. Это то, что я понял, прочитав несколько статей MSDN. Вы включаете двухсторонний SSL в IIS, а затем, когда пользователь пытается перейти на веб-сайт, IIS отправит браузеру запрос со списком утвержденных центров сертификации, а браузер позволит пользователю выбрать соответствующий сертификат из своего хранилища сертификатов и отправит его. бэкэнд Я предполагаю, что IIS сделает 2 вещи
- Убедитесь, что у пользователя есть закрытый ключ, соответствующий сертификату (путем переговоров прикрытия)
- На основе сопоставления сертификатов пользователей AD IIS сообщит имя пользователя приложению.
Сделайте простоту аутентификации, вызывая криптографические функции, в зависимости от того, какой веб-сервер это делает.
- Покажите экран пользователя, куда он загружает сертификат, и приложение гарантирует, что у пользователя есть закрытый ключ, соответствующий сертификату (запросив интерфейс подписать некоторую строку с использованием сертификата).
- Приложение имеет базу данных, в которой хранятся некоторые данные, что позволяет каждому пользователю сопоставляться с его идентификатором пользователя. Это может быть
- весь сертификат, соответствующий каждому идентификатору пользователя
- CA и серийный номер сертификата, соответствующий каждому идентификатору пользователя.
Мне было интересно, какой метод обычно используется? Каковы лучшие практики? Если я должен пойти с # 3, каковы лучшие способы сделать это?
То, что также может легко работать с приложениями для смартфонов, станет дополнительным бонусом.
Обновить
Позвольте мне прояснить мое утверждение «закодировать часть аутентификации самостоятельно», потому что некоторые ответы, кажется, указывают на то, что это было неправильно понято - мой недостаток в том, что я не ясен.
Это не значит, что я сам пишу криптовалюту. Это просто означает, что я на самом деле буду вызывать крипто-подпрограммы явно, а не зависеть от IIS или любого другого веб-сервера, делающего это неявно.