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


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

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

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

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

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

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

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

Изображение, включаемого SS L в свойствах

Информация о работе с 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. Перейдите к файлу сертификата TempCA.cer.
  8. Нажмите кнопку Открыть, затем нажмите кнопку Далее и завершите работу мастера. (Вам будет предложено повторно ввести пароль.)

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

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;