Поделиться через


Работа с SSL в веб-API

Несколько распространенных схем проверки подлинности не защищены по простому протоколу HTTP. В частности, обычная проверка подлинности и проверка подлинности форм отправляют незашифрованные учетные данные. Чтобы обеспечить безопасность, эти схемы проверки подлинности должны использовать SSL. Кроме того, сертификаты SSL-клиента можно использовать для проверки подлинности клиентов.

Включение SSL на сервере

Чтобы настроить SSL в IIS 7 или более поздней версии, выполните приведенные ниже действия.

  • Создайте или получите сертификат. Для тестирования можно создать самозаверяющий сертификат.
  • Добавьте привязку HTTPS.

Дополнительные сведения см. в статье Настройка SSL в IIS 7.

Для локального тестирования можно включить SSL в IIS Express из Visual Studio. В окне свойств установите SSL включено на True. Обратите внимание на значение URL-адреса SSL; используйте этот URL-адрес для тестирования подключений HTTPS.

Изображение с включённым SSL значением true в свойствах

Применение SSL в контроллере веб-API

Если у вас есть как HTTPS, так и привязка HTTP, клиенты по-прежнему могут использовать HTTP для доступа к сайту. Некоторые ресурсы могут быть доступны по протоколу HTTP, а для других ресурсов требуется SSL. В этом случае используйте фильтр действий, чтобы требовать SSL для защищенных ресурсов. В следующем коде показан фильтр проверки подлинности веб-API, который проверяет наличие SSL:

public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
            {
                ReasonPhrase = "HTTPS Required"
            };
        }
        else
        {
            base.OnAuthorization(actionContext);
        }
    }
}

Добавьте этот фильтр в любые действия веб-API, требующие SSL:

public class ValuesController : ApiController
{
    [RequireHttps]
    public HttpResponseMessage Get() { ... }
}

Сертификаты SSL-клиента

SSL обеспечивает проверку подлинности с помощью сертификатов инфраструктуры открытых ключей. Сервер должен предоставить сертификат, который удостоверяет его подлинность для клиента. Для клиента менее распространено предоставление сертификата серверу, но это один из вариантов проверки подлинности клиентов. Чтобы использовать сертификаты клиента с SSL, вам потребуется способ распространения подписанных сертификатов пользователям. Для многих типов приложений это не будет хорошим взаимодействием с пользователем, но в некоторых средах (например, корпоративная) это может оказаться возможным.

Преимущества Недостатки
— учетные данные сертификата сильнее имени пользователя или пароля. — SSL предоставляет полный безопасный канал с проверкой подлинности, целостностью сообщений и шифрованием сообщений. — Необходимо получить PKI-сертификаты и управлять ими. — клиентская платформа должна поддерживать SSL-сертификаты клиента.

Чтобы настроить IIS для принятия сертификатов клиента, откройте диспетчер IIS и выполните следующие действия:

  1. Щелкните узел сайта в структуре дерева.

  2. Дважды щелкните на параметрах SSL в центральной панели.

  3. Выберите один из следующих вариантов в разделе Сертификаты клиентов.

    • Принять: IIS примет сертификат от клиента, но не требует его.
    • Требовать: Требуется сертификат клиента. (Чтобы включить этот параметр, необходимо также выбрать "Требовать SSL")

Эти параметры также можно задать в файле ApplicationHost.config:

<system.webServer>
    <security>
        <access sslFlags="Ssl, SslNegotiateCert" />
        <!-- To require a client cert: -->
        <!-- <access sslFlags="Ssl, SslRequireCert" /> -->
    </security>
</system.webServer>

Флаг sslNegotiateCert означает, что службы IIS будут принимать сертификат от клиента, но не требует его (эквивалентен параметру "Принять" в диспетчере IIS). Чтобы требовать сертификат, задайте флаг SslRequireCert. Для тестирования можно также задать эти параметры в IIS Express, в локальном файле applicationhost.Config, расположенном в "Documents\IISExpress\config".

Создание сертификата клиента для тестирования

Для тестирования можно использовать MakeCert.exe для создания сертификата клиента. Сначала создайте корневой центр тестирования:

makecert.exe -n "CN=Development CA" -r -sv TempCA.pvk TempCA.cer

Makecert предложит ввести пароль для закрытого ключа.

Затем добавьте сертификат в папку "Доверенные корневые центры сертификации" тестового сервера, как показано ниже.

  1. Откройте MMC.
  2. В разделе Файлвыберите Добавить/удалить оснастку.
  3. В разделе Доступные оснасткивыберите Сертификаты, а затем щелкните Добавить.
  4. Выберите учетную запись компьютера.
  5. Выберите локальный компьютер и завершите работу мастера.
  6. В области панели навигации разверните узел "Доверенные корневые центры сертификации".
  7. В меню Действия выберите пункт Все задачи, а затем щелкните Импорт, чтобы запустить мастер импорта сертификатов.
  8. Перейдите к файлу сертификата TempCA.cer.
  9. Нажмите Открыть, а затем нажмите Далее и завершите работу мастера. (Вам будет предложено повторно ввести пароль.)

Теперь создайте сертификат клиента, подписанный первым сертификатом:

makecert.exe -pe -ss My -sr CurrentUser -a sha1 -sky exchange -n "CN=name" 
     -eku 1.3.6.1.5.5.7.3.2 -sk SignedByCA -ic TempCA.cer -iv TempCA.pvk

Использование сертификатов клиента в веб-API

На стороне сервера вы можете получить сертификат клиента, вызвав GetClientCertificate в сообщении запроса. Метод возвращает значение NULL, если сертификат клиента отсутствует. В противном случае возвращается экземпляр X509Certificate2. Используйте этот объект для получения сведений из сертификата, например издателя и субъекта. Затем эти сведения можно использовать для проверки подлинности и (или) авторизации.

X509Certificate2 cert = Request.GetClientCertificate();
string issuer = cert.Issuer;
string subject = cert.Subject;