Защита API с помощью сертификатов

Завершено

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

Проверка подлинности клиента на уровне TLS

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

Свойство Description
Центр сертификации Разрешать только сертификаты, подписанные конкретным центром сертификации
Отпечаток Разрешать сертификаты, содержащие указанный отпечаток
Тема Разрешать сертификаты только с указанной темой
Дата окончания срока действия Не разрешать просроченные сертификаты

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

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

  • Проверьте, кто выдал сертификат. Если он выдан центром сертификации, которому вы доверяете, вы можете использовать сертификат. На портале Azure можно настроить доверенные центры сертификации, чтобы автоматизировать этот процесс.
  • Если сертификат выдан партнером, убедитесь, что он действительно поступает от него. Например, если сертификат доставлен лично, вы можете быть уверены в его подлинности. Это так называемые самозаверяющие сертификаты.

Принятие сертификатов клиента на потребительском уровне

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

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

Политики сертификата авторизации

Эти политики создаются в файле политики обработки входящего трафика в шлюзе управления API:

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

Проверка отпечатка сертификата клиента

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

<choose>
    <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-thumbprint")" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

Проверка отпечатка на соответствие сертификатам, переданным в службу управления API

В предыдущем примере только один отпечаток сработает, поэтому только один сертификат будет подтвержден. Как правило, каждый клиент или партнер передает разные сертификаты с разными отпечатками. Для поддержки этого сценария получайте сертификаты от ваших партнеров и используйте страницу Сертификаты клиента на портале Azure, чтобы отправить их в ресурс службы управления API. Добавьте следующий код в политику.

<choose>
    <when condition="@(context.Request.Certificate == null || !context.Request.Certificate.Verify()  || !context.Deployment.Certificates.Any(c => c.Value.Thumbprint == context.Request.Certificate.Thumbprint))" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

Проверка издателя и субъекта сертификата клиента

В следующем примере проверяется издатель и субъект сертификата, переданного в запрос.

<choose>
    <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Issuer != "trusted-issuer" || context.Request.Certificate.SubjectName.Name != "expected-subject-name")" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>