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

Завершено

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

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

Здесь вы узнаете, как настроить службу API Management для приема сертификатов клиентов.

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

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

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

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

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

  • Проверьте, кто выдал сертификат. Если он выдан центром сертификации, которому вы доверяете, вы можете использовать сертификат. На портале 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>