[Из песочницы] Настраиваем авторизацию в IIS по сертификатам используя OneToOne

Всем доброго времени суток. Так уж получилось, на работе необходимо было настроить сервер с IIS, да не просто настроить, но повесить авторизацию на разные сервисы с использованием только определенного сервису сертификата. Данная проблема может быть решена использованием нескольких центров генерации, но не будем все усложнять и приступим к настройке «ОдинКОдному» нашего IIS.Генерация необходимых ключей очень подробно описана в интернете (статья на хабре) и не должна вызвать особых проблем, поэтому эту часть я опущу.Переходим к делу:1) Устанавливаем IIS и необходимые компоненты. Обязательно отмечаем «Проверка подлинности с сопоставлением сертификата клиента IIS».

ab98ae2ad6154c9085eae7bdafb99304.png

2) Для привязки нам понадобится клиентский сертификат в кодировке base64, его очень просто экспортировать из остнастки (certmgr.msc) «Сертификаты» или из «Свойства обозревателя».

14ad01077f5e420da15f63fa6f5b4afd.png

3) Полученный сертификат открываем в текстовом редакторе и выстаиваем в одну линию, предварительно удалив строчки «BEGIN CERTIFICATE» и «END CERTIFICATE».

ecad7c7a231f446a80d4f7b44fafaee9.png

С подготовкой закончили переходим к серверу.

4) Запускаем остнастку (inetmgr) «Диспетчер служб IIS», и устанавливаем сертификат сервера. В моём случае CN сертификата Localhost.

8ed7209f566942118a0e3bf460e52b5d.png

5) После этого мы можем привязать этот сертификат к сервисам. Идем в привязки и выбрав Https указываем необходимый порт и сертификат.

6) В параметрах SSL отмечаем «Требовать SSL» и сертификат клиента «требовать».

85af1b88161b41208c6b8983e6d42ce6.png

7) Теперь любой сертификат выпущенный нашим УЦ подойдет для авторизации, но цель данной статьи как раз показать следующий шаг когда клиентов с сертификатами необходимо разделить. Идем в «Редактор конфигураций» по адресу: «system.webServer/security/authentication/iisClientCertificateMappingAuthentication».

8b0e3c6521fa4883b32bf04f0f437c3f.png

8) Здесь предстоит сделать выбор или мы пускаем по конкретным сертификатам или по определенному полю в сертификате (например уникальный OID).

9) Рассмотрим параметр «oneToOneCertificateMappingsEnabled». Установив его значении в «True» мы сможем привязать конкретный сертификат к пользователю.

80866f902ef748cc973c513f1b14cd94.png

10) Полученный на втором пункте сертификат вставляем в поле «certificate». Поля «userName» и «password» заполняем учетной записью, которую предварительно создали.

11) Теперь при предъявлении занесенного клиентского сертификата мы получим доступ с правами указанной учетной записи. Однако все остальные сертификаты продолжат преспокойно работать и получать анонимный доступ, что бы этого избежать необходимо в iis, отключить анонимную проверку подлинности.

68ec29b004ae4e7daa9aa6ec86dcc271.png

На этом этапе авторизация должна проходить только по заданному сертификату.

Код для 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

© Habrahabr.ru