Настройка сопоставлений сертификатов клиента "один к одному"

Роберт Люсиро

Основные сведения

В IIS 6 был пользовательский интерфейс для настройки и сопоставления одного с одним сертификатом для проверки подлинности. Он позволил пользователям выбрать сертификат клиента проверки и назначить авторизованные учетные данные пользователя. В IIS 7 и более поздних версиях нет аналогичного пользовательского интерфейса. Это пошаговое руководство предназначено для указания пользователям настроить один на один клиентский сертификат с помощью редактора конфигурации пакета администрирования. Пользователи, у которых нет этой надстройки, могут просмотреть раздел приложения, чтобы ознакомиться с аргументами AppCmd и примерами кода C#, необходимых для выполнения этого пошагового руководства.

Схема IIS 7 и выше

Это схема функции проверки подлинности сопоставления сертификатов клиента IIS в IIS 7 и более поздних версиях.

<sectionSchema name="system.webServer/security/authentication/iisClientCertificateMappingAuthentication">
  <attribute name="enabled" type="bool" defaultValue="false" />
  <attribute name="oneToOneCertificateMappingsEnabled" type="bool" defaultValue="true" />
  <element name="oneToOneMappings">
    <collection addElement="add" clearElement="clear">
      <attribute name="enabled" type="bool" defaultValue="true" />
      <attribute name="userName" type="string" />
      <attribute name="password" type="string" encrypted="true" />
      <attribute name="certificate" type="string" required="true" isUniqueKey="true" />
    </collection>
  </element>
</sectionSchema>

Необходимые условия

Это необходимые условия для этого пошагового руководства. Я не буду охватывать, как создавать или делать эти вещи.

  1. Установленный модуль сопоставления сертификатов клиента IIS
  2. Правильно сконфигурированный веб-сайт с привязкой HTTPS.
  3. Сертификат Base-64 (файл .cer). [Примечание. Это может быть любой допустимый 64-разрядный сертификат, но он должен быть в виде файла]
  4. Установлен клиентский сертификат на устройстве клиента
  5. Установка пакета администрирования IIS 7 Technical Preview 2

Шаг 1. Получение BLOB сертификата

Элемент коллекции oneToOneMappings имеет атрибут, называемый сертификатом. Необходимое значение для этого атрибута — это не то, что содержит сертификат, а фактический BLOB-объект сертификата. Вот как вы извлекаете его.

  1. Щелкните правой кнопкой мыши на файл .cer.

  2. Выберите "Открыть с помощью... в контекстном меню"

  3. Выберите Блокнот из списка "Другие программы" и нажмите кнопку "ОК". Примечание. Блокнот может быть скрыт под выпадающим меню в представлении списка Vista/Windows 2008

  4. Это то, что должно отображаться в блокноте:

    -----BEGIN CERTIFICATE----- 
    MIIEfjCCA2agAwIBAgIKFW1IXAAAAAAAAjANBgkqhkiG9w0BAQUFADAbMRkwFwYD 
    VQQDExBJSVNSZW1vdGVNZ3JUZXN0MB4XDTA4MDIxMTIxNTk1NloXDTA5MDIxMTIy 
    MDk1NlowaDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV 
    BAcTB1JlZG1vbmQxDTALBgNVBAoTBE1TRlQxDDAKBgNVBAsTA0lJUzEVMBMGA1UE 
    AxMMUkxVQ0VSTzItSUlTMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3611j 
    34q2qQgHa7ao11TcQMDYlJMrqET05MWFY1/Vso+leujLoIGTfdHOuz4IBVoeUE+y 
    mlL8r53s2BQeVFROnDtg4Jko1zJsz7AUAnQNBk/GYA1AHYmhY79Z0p1KXW/wSTJB 
    tdUn732GQOqYf4wY8jOD2zUJDUG4HXm6ib8ajwIDAQABo4IB+TCCAfUwDgYDVR0P 
    AQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUFBwMBMHgGCSqGSIb3DQEJDwRrMGkw 
    DgYIKoZIhvcNAwICAgCAMA4GCCqGSIb3DQMEAgIAgDALBglghkgBZQMEASowCwYJ 
    YIZIAWUDBAEtMAsGCWCGSAFlAwQBAjALBglghkgBZQMEAQUwBwYFKw4DAgcwCgYI 
    KoZIhvcNAwcwHQYDVR0OBBYEFHbHA+HwZcIrslklj1W3O23UFrBgMB8GA1UdIwQY 
    MBaAFMxzlGbmkp2+phhDg7TPfi83d7UVMHMGA1UdHwRsMGowaKBmoGSGL2h0dHA6 
    Ly9paXNzYjMwNS9DZXJ0RW5yb2xsL0lJU1JlbW90ZU1nclRlc3QuY3JshjFmaWxl 
    Oi8vXFxpaXNzYjMwNVxDZXJ0RW5yb2xsXElJU1JlbW90ZU1nclRlc3QuY3JsMIGe 
    BggrBgEFBQcBAQSBkTCBjjBEBggrBgEFBQcwAoY4aHR0cDovL2lpc3NiMzA1L0Nl 
    cnRFbnJvbGwvaWlzc2IzMDVfSUlTUmVtb3RlTWdyVGVzdC5jcnQwRgYIKwYBBQUH 
    MAKGOmZpbGU6Ly9cXGlpc3NiMzA1XENlcnRFbnJvbGxcaWlzc2IzMDVfSUlTUmVt 
    b3RlTWdyVGVzdC5jcnQwDQYJKoZIhvcNAQEFBQADggEBAEsSkcx0re36IL80UphJ 
    w/srR3LBsy8sfwqxBMzMTdF7k6jYtUVpn3D2Dd4JXXVOaEVud9YNn9pr6xJL4t79 
    Zh+hJzIPA5pQLbccx4vjWB4cWEYxzcoKYCuUdZrfPFXO1a5kQAj8IZ0/6bhMceyR 
    Z7dRDoaIuAGQLFAlC/KjIBCemDi54MlWtvATQ8bmiRuEOWeneK2Vd2e0fxyezk05 
    dRqa8DEC74CQN4rQuz395ECm+M/hQnN+dHOygV8n9swd0bdNq8qypwfVUes5HIpj 
    LFmKTuGyFSVj7jv+64oTxvxtYX2QFp9q6Bi+qj0uyrX8Xjxy5rPSVPEfnxPCBg58 
    RCI= 
    -----END CERTIFICATE-----
    
  5. Удалите -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----

  6. Отформатируйте бинарный объект сертификата, чтобы он был одной строкой.

  7. Сохраните этот файл как clientCertBlob.txt

Шаг 2: Включение проверки подлинности сопоставления клиентских сертификатов IIS и сопоставления сертификатов один-к-одному для веб-сайта

Следующие действия помогут включить функцию аутентификации с использованием сопоставления клиентских сертификатов, сопоставление сертификатов 'один-к-одному', а также добавить запись для сопоставления.

  1. Запуск Inetmgr, пользовательский интерфейс диспетчера IIS
  2. Выберите настраиваемый веб-сайт SSL и откройте редактор конфигурации
  3. Введите "system.webServer/security/authentication/iisClientCertificateMappingAuthentication" в раскрывающемся списке Раздел.
  4. Выберите поле включено и измените значение на true
  5. Выберите запись сетки свойств oneToOneCertificateMappingsEnabled и измените значение на true
  6. Выберите элемент сетки параметров oneToOneMappings и нажмите "Изменить элементы..." в панели задач "Действия".
  7. Щелкните "Добавить" в списке задач редактора коллекций
  8. Скопируйте строку с данными сертификата из приведенного выше текста и вставьте её в поле certificate.
  9. Задайте имя пользователя и пароль, под которыми клиенты будут проходить аутентификацию.
  10. Установите для поля enabled значение true.
  11. Закрыть редактор коллекции
  12. Нажмите кнопку "Применить" в области задач "Действия" [Примечание. Нажмите кнопку "Создать скрипт " перед нажатием кнопки "Применить ", чтобы получить скрипты для этого процесса]

После завершения сервер будет настроен на обработку аутентификации с сопоставлением сертификатов клиента IIS с одной записью однозначного соответствия сертификатов.

Шаг 3. Включение проверки подлинности сертификата клиента для веб-сайта с помощью SSL

После создания сопоставления и включения функции сайт должен быть настроен для использования сертификатов клиента.

  1. Из Inetmgr, UI диспетчера IIS, выберите SSL веб-сайт для использования клиентских сертификатов.
  2. Выбор модуля пользовательского интерфейса SSL
  3. В разделе "Сертификаты клиента" выберите переключатель "Принять"
  4. Нажмите кнопку "Применить" в области задач "Действия"

Теперь веб-сайт настроен для принятия и проверки подлинности клиентов на основе сертификатов клиентов.

Шаг 4. Убедитесь, что всё работает

Клиент, который пытается получить доступ к веб-странице SSL, должен правильно установить сертификат клиента. Если клиент пытается запросить страницу без сертификата, будет возвращён код 401. После правильного установки сертификата клиента страница будет использоваться как обычная.

Играйте с различными сочетаниями правил авторизации в соответствии с вашими потребностями.

Сводка

Теперь вы настроили сопоставления сертификатов клиента IIS и одно однозначное сопоставление сертификатов.

Приложение

Это фрагменты кода для выполнения пошагового руководства 2 и 3. Все это было создано с помощью создания скриптов редактора конфигурации.

Конкретные инструкции 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='testUser',password='securePassWord!1',certificate='CERTIFICATE_BLOB']" /commit:apphost

appcmd.exe set config "Default Web Site" -section:system.webServer/security/access /sslFlags:"Ssl, SslNegotiateCert, Ssl128"  /commit:apphost

Код C#:

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample {

    private static void Main() {
        
        using(ServerManager serverManager = new ServerManager()) { 
            Configuration config = serverManager.GetApplicationHostConfiguration();
            
            ConfigurationSection iisClientCertificateMappingAuthenticationSection = 
                    config.GetSection("system.webServer/security/authentication/iisClientCertificateMappingAuthentication", "Default Web Site");
            iisClientCertificateMappingAuthenticationSection["enabled"] = true;
            iisClientCertificateMappingAuthenticationSection["oneToOneCertificateMappingsEnabled"] = true;
            
            ConfigurationElementCollection oneToOneMappingsCollection = 
                     iisClientCertificateMappingAuthenticationSection.GetCollection("oneToOneMappings");
            
            ConfigurationElement addElement = oneToOneMappingsCollection.CreateElement("add");
            addElement["userName"] = @"testUser";
            addElement["password"] = @"securePassWord!1";
            addElement["certificate"] = @"CERTIFICATE_BLOB";
            oneToOneMappingsCollection.Add(addElement);
            
            serverManager.CommitChanges();
        }
    }
}

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample {

    private static void Main() {
        
        using(ServerManager serverManager = new ServerManager()) { 
            Configuration config = serverManager.GetApplicationHostConfiguration();
            
            ConfigurationSection accessSection = config.GetSection("system.webServer/security/access", "Default Web Site");
            accessSection["sslFlags"] = @"Ssl, SslNegotiateCert, Ssl128";
            
            serverManager.CommitChanges();
        }
    }
}