Я пытаюсь настроить проверку подлинности сертификата клиента в приложении ASP.NET MVC3, работающем в IIS 8. Клиент (надежная третья сторона) использует самоподписанный сертификат SSL для аутентификации, и мое приложение заранее знает отпечаток пальца и проверяет, что у запроса есть соответствующий сертификат.
Не работает "из коробки" - IIS отклоняет запросы с HTTP 403.16 (сертификат клиента ненадежный).
Я много экспериментировал, и похоже, что если я добавлю сертификат клиента в хранилища сертификатов «Root» (доверенные корневые центры сертификации) или «Auth Root» (сторонние корневые центры сертификации), то запросы будут передаваться в код приложения - IIS теперь доверяет сертификату и принимает запросы. Так что добавление сертификата в одно из этих хранилищ «заставляет его работать».
Проблема в том, что я не уверен, какие еще последствия может иметь такое изменение. Предположим, что Хорошая Третья сторона теряет часть своего закрытого ключа сертификата, а какая-то Плохая Третья сторона злоупотребляет ею - что они могут сделать, кроме как выдавать себя за Хорошую Сторону? Может быть, они смогут подписать пакет кода, которому моя система будет доверять? Может быть, они могут выпустить сертификат сайта и заставить мою систему доверять их вредоносному сайту?
В каком магазине мне добавить сертификат клиента, чтобы свести к минимуму непредвиденные риски безопасности?
Вы не можете решить вашу проблему без риска для безопасности. Единственный вариант для вас - установить сертификат в Local Machine\Trusted Root CAs
хранить. В результате этому стороннему сертификату будут доверять все приложения, использующие Windows Cert Store. Если это сертификат CA, то все дочерние сертификаты ниже этого корневого будут доверенными в вашей системе.
Если у вас есть собственный PKI, вы можете повысить безопасность, выполнив квалифицированное подчинение этого сертификата. С квалифицированным подчинением вы сможете устанавливать различные типы ограничений, при которых сертификат будет доверять или нет.