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:

Property Description
Autoridade de Certificação (AC) Permitir apenas certificados assinados por uma CA específica
Thumbprint Permitir certificados que contêm um thumbprint especificado
Assunto Permitir apenas certificados com um assunto especificado
Data de Expiração 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.
  • Se o certificado for emitido pelo parceiro, verifique se é proveniente do mesmo. Por exemplo, se o parceiro entregar o certificado em pessoa, pode ter certeza da respetiva autenticidade. Estes são conhecidos como certificados autoassinados.

Aceitar os certificados de cliente no escalão de Consumo

O escalão de Consumo na Gestão de API foi concebido para estar em conformidade com os principais 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. No escalão de Consumo, tem de permitir a utilização dos certificados de cliente de forma explícita, o que pode fazer na página Domínios personalizados. Esta etapa não é necessária em outras camadas.

Configurar o gateway para pedir 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 suportar este cenário, obtenha os certificados dos seus parceiros e utilize a página de Certificados de cliente no portal do Azure para os carregar para o recurso da Gestão 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>