Упражнение. Использование клиентских сертификатов для защиты доступа к API

Завершено

Вы настроите службу управления API, чтобы принимать сертификаты клиентов, используя политики входящего трафика.

Предположим, что ваша метеорологическая компания решила защитить свой API с помощью проверки подлинности на основе сертификата для некоторых клиентов. Они уже используют проверку подлинности на основе сертификатов в других системах. Эта конфигурация позволит клиентам использовать существующие сертификаты для проверки подлинности самостоятельно через шлюз управления API.

В этом уроке рассматриваются следующие задачи:

  • Создание самозаверяющего сертификата
  • Настройка шлюза для запроса сертификатов клиента.
  • Получение отпечатка для сертификата.
  • Изменение политики входящего трафика, чтобы разрешить доступ только клиентам с указанным сертификатом в запросе.
  • Вызов шлюза управления API и передача сертификата с помощью curl.

Примечание.

В этом упражнении используются ресурсы, настроенные в предыдущем упражнении.

создает самозаверяющий сертификат

Прежде всего, с помощью Cloud Shell создайте самозаверяющий сертификат, который затем будете использовать для проверки подлинности между клиентом и шлюзом Управления API.

  1. Чтобы создать закрытый ключ и сертификат, выполните следующие команды в Cloud Shell.

    pwd='<Enter a secure password here>'
    pfxFilePath='selfsigncert.pfx'
    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out selfsigncert.crt -subj /CN=localhost
    

    Чтобы сделать этот пример простым, приведенные выше команды включают пароль, используемый для защиты закрытого ключа. При каждом создании закрытого ключа для собственного использования убедитесь в том, что вы создали защищенный пароль и контролируете доступ к нему.

  2. Теперь преобразуйте сертификат в PEM-формат, который может использовать инструмент curl, выполнив следующие команды:

    openssl pkcs12 -export -out $pfxFilePath -inkey privateKey.key -in selfsigncert.crt -password pass:$pwd
    openssl pkcs12 -in selfsigncert.pfx -out selfsigncert.pem -nodes
    

    При появлении запроса введите безопасный пароль и нажмите клавишу ВВОД.

Настройка шлюза для запроса сертификатов клиента.

Так как для Управления API используется уровень потребления, необходимо настроить шлюз для приема сертификатов клиента. Выполните следующие действия.

  1. На портале Azure, который уже открыт, выберите свою службу "Управление API" (apim-WeatherDataNNNN).

  2. На панели меню слева в разделе Развертывание и инфраструктура выберите Личные домены. Откроется панель Личные домены для службы управления API.

  3. В поле *Запрос сертификата клиента нажмите кнопку "Да" и в верхней строке меню нажмите кнопку "Сохранить".

    Настройка шлюза для запроса сертификатов.

Получение отпечатка для сертификата.

В этом разделе вы настроите Управление API на прием запросов только с сертификатом, имеющим определенный отпечаток. Давайте получим этот отпечаток из сертификата.

Примечание.

В английском языке отпечаток SSL-сертификата может называться fingerprint или thumbprint.

  1. В Cloud Shell выполните приведенный ниже код.

    Fingerprint="$(openssl x509 -in selfsigncert.pem -noout -fingerprint)"
    Fingerprint="${Fingerprint//:}"
    echo ${Fingerprint#*=}
    
  2. Скопируйте полные выходные данные (шестнадцатеричную строку) и вставьте значение отпечатка в текстовый файл.

Изменение политики входящего трафика, чтобы разрешить только запросы с действительным сертификатом

Теперь создайте политику проверки подлинности в шлюзе управления API.

  1. На портале Azure выберите свою службу управления API. При необходимости в меню ресурсов Azure или на домашней странице выберете пункт Все ресурсы, а затем — службу "Управление API".

  2. В левой панели меню в разделе Интерфейсы API выберите Интерфейсы API. Откроется панель API для службы управления API.

  3. Во втором меню выберите Данные о погоде.

  4. В поле Обработка входящих данных выберите значок </>, чтобы открыть редактор кода политик. Отобразится HTML-код для узла политик.

    Кнопка политики обработки входящего трафика.

  5. Замените узел <inbound> файла политики на следующий XML-код, подставив вместо desired-fingerprint скопированный ранее отпечаток:

    <inbound>
        <choose>
            <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-fingerprint")" >
                <return-response>
                    <set-status code="403" reason="Invalid client certificate" />
                </return-response>
            </when>
        </choose>
        <base />
    </inbound>
    
  6. Выберите Сохранить.

Вызов шлюза и передача сертификата клиента

Теперь можно проверить новую политику проверки подлинности с сертификатом и без него.

  1. Для тестирования API без сертификата выполните следующую команду в Cloud Shell, заменив значения заполнителей именем шлюза API и ключом подписки.

    curl -X -v GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \
      -H 'Ocp-Apim-Subscription-Key: [Subscription Key]' 
    

    Эта команда должна вернуть сообщение об ошибке 403 "Сертификат клиента", а данные не будут возвращены.

  2. В Cloud Shell, чтобы протестировать API с сертификатом, скопируйте и вставьте следующую команду cURL, используя первичный ключ подписки из первого упражнения (получить этот первичный ключ также можно в области подписок для вашей службы Данных о погоде в Управлении API). Не забудьте включить имя шлюза API.

    curl -X GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \
      -H 'Ocp-Apim-Subscription-Key: [subscription-key]' \
      --cert-type pem \
      --cert selfsigncert.pem
    

    Эта команда должна выдать успешный ответ и отобразить данные о погоде, аналогичные следующим.

    {"mainOutlook":{"temperature":32,"humidity":34},"wind":{"speed":11,"direction":239.0},"date":"2019-05-16T00:00:00+00:00","latitude":53.0,"longitude":-1.0}