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 (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 Permitir apenas certificados que não tenham expirado

Estas propriedades não são mutuamente exclusivas e podem ser combinadas para formar os seus próprios requisitos da política. Por exemplo, pode especificar que o certificado transmitido no pedido esteja assinado por uma determinada autoridade de certificação e que não expirou.

Os certificados de cliente são assinados para garantir que não são 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. Este passo não é necessário noutros escalões.

Configure the gateway to request certificates

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:

Inbound processing policy button

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. O thumbprint 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>