[Из песочницы] Настраиваем авторизацию в IIS по сертификатам используя OneToOne
Всем доброго времени суток. Так уж получилось, на работе необходимо было настроить сервер с IIS, да не просто настроить, но повесить авторизацию на разные сервисы с использованием только определенного сервису сертификата. Данная проблема может быть решена использованием нескольких центров генерации, но не будем все усложнять и приступим к настройке «ОдинКОдному» нашего IIS.Генерация необходимых ключей очень подробно описана в интернете (статья на хабре) и не должна вызвать особых проблем, поэтому эту часть я опущу.Переходим к делу:1) Устанавливаем IIS и необходимые компоненты. Обязательно отмечаем «Проверка подлинности с сопоставлением сертификата клиента IIS».
2) Для привязки нам понадобится клиентский сертификат в кодировке base64, его очень просто экспортировать из остнастки (certmgr.msc) «Сертификаты» или из «Свойства обозревателя».
3) Полученный сертификат открываем в текстовом редакторе и выстаиваем в одну линию, предварительно удалив строчки «BEGIN CERTIFICATE» и «END CERTIFICATE».
С подготовкой закончили переходим к серверу.
4) Запускаем остнастку (inetmgr) «Диспетчер служб IIS», и устанавливаем сертификат сервера. В моём случае CN сертификата Localhost.
5) После этого мы можем привязать этот сертификат к сервисам. Идем в привязки и выбрав Https указываем необходимый порт и сертификат.
6) В параметрах SSL отмечаем «Требовать SSL» и сертификат клиента «требовать».
7) Теперь любой сертификат выпущенный нашим УЦ подойдет для авторизации, но цель данной статьи как раз показать следующий шаг когда клиентов с сертификатами необходимо разделить. Идем в «Редактор конфигураций» по адресу: «system.webServer/security/authentication/iisClientCertificateMappingAuthentication».
8) Здесь предстоит сделать выбор или мы пускаем по конкретным сертификатам или по определенному полю в сертификате (например уникальный OID).
9) Рассмотрим параметр «oneToOneCertificateMappingsEnabled». Установив его значении в «True» мы сможем привязать конкретный сертификат к пользователю.
10) Полученный на втором пункте сертификат вставляем в поле «certificate». Поля «userName» и «password» заполняем учетной записью, которую предварительно создали.
11) Теперь при предъявлении занесенного клиентского сертификата мы получим доступ с правами указанной учетной записи. Однако все остальные сертификаты продолжат преспокойно работать и получать анонимный доступ, что бы этого избежать необходимо в iis, отключить анонимную проверку подлинности.
На этом этапе авторизация должна проходить только по заданному сертификату.
Код для appcmd:
appcmd.exe set config «Default Web Site» -section: system.webServer/security/authentication/iisClientCertificateMappingAuthentication /enabled: «True» /oneToOneCertificateMappingsEnabled: «True» /commit: apphost
appcmd.exe set config «Default Web Site» -section: system.webServer/security/authentication/iisClientCertificateMappingAuthentication /+«oneToOneMappings.[userName='22', password='22', certificate='текст сертификата в кодировке base64']» /commit: apphost
appcmd.exe set config «Default Web Site» -section: system.webServer/security/access /sslFlags: «Ssl, SslNegotiateCert, SslRequireCert» /commit: apphost