APIs seguras usando certificados

Concluído

Os certificados podem ser usados para fornecer autenticação mútua TLS (Transport Layer Security) entre o cliente e o gateway de API. Pode configurar o gateway de Gestão de API para permitir apenas os pedidos com certificados que contêm um thumbprint específico. A autorização ao nível do gateway é processada através de políticas de entrada.

Autenticação do cliente Transport Layer Security

Com a autenticação de cliente TLS, o gateway da Gestão de API pode inspecionar o certificado contido no pedido do cliente e verificar propriedades como:

Propriedade Descrição
Autoridade de certificação (CA) Permitir apenas certificados assinados por uma CA específica
Impressão digital Permitir certificados que contêm um thumbprint especificado
Assunto Permitir apenas certificados com um assunto especificado
Data de validade Não permitir certificados expirados

Essas propriedades não são mutuamente exclusivas e podem ser combinadas para formar seus próprios requisitos de política. Por exemplo, você pode especificar que o certificado passado na solicitação está assinado e não expirou.

Os certificados de cliente são assinados para garantir que não sejam adulterados. Quando um parceiro enviar um certificado, verifique se é proveniente do mesmo e não de um impostor. Existem duas formas comuns de verificar um certificado:

  • Verifique quem emitiu o certificado. Se o emissor tiver sido uma autoridade de certificação em que confia, pode utilizar o certificado. Pode configurar as autoridades de certificação de confiança no portal do Azure para automatizar este processo.
  • Certifique-se de confiar na origem de quaisquer certificados autoassinados.

Aceitar os certificados de cliente no escalão de Consumo

A camada Consumo no Gerenciamento de API foi projetada para estar em conformidade com os princípios de design sem servidor. Se criar as suas APIs a partir de tecnologias sem servidor, como as Funções do Azure, este escalão é uma boa opção. Na camada Consumo, você deve habilitar explicitamente o uso de certificados de cliente, o que pode ser feito na página Domínios personalizados . Esta etapa não é necessária em outras camadas.

Configurar o gateway para solicitar certificados

Políticas de Autorização de Certificação

Crie estas políticas no ficheiro da política de processamento de entrada no gateway da Gestão de API:

Botão de política de processamento de entrada

Verificar o thumbprint de um certificado de cliente

Todos os certificados de cliente incluem um thumbprint, que é um hash, calculado a partir de outras propriedades de certificação. A impressão digital garante que os valores no certificado não foram alterados desde que o certificado foi emitido pela autoridade de certificação. Pode verificar o thumbprint na sua política. O seguinte exemplo verifica se o thumbprint do certificado foi transmitido no pedido:

<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>

Verificar o thumbprint com base nos certificados carregados para a Gestão de API

No exemplo anterior, apenas um thumbprint podia funcionar, pelo que só um certificado podia ser validado. Normalmente, cada cliente ou empresa parceira transmitiria um certificado diferente com um thumbprint diferente. Para dar suporte a esse cenário, obtenha os certificados de seus parceiros e use a página Certificados de cliente no portal do Azure para carregá-los no recurso de Gerenciamento de API. Em seguida, adicione este código à sua política:

<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>

Verificar o emissor e assunto de certificado de cliente

Este exemplo verifica se o emissor e assunto do certificado foram transmitidos no pedido:

<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>