Proteger APIs usando certificados

Concluído

Os certificados podem ser usados para fornecer autenticação mútua de TLS (Segurança de Camada de Transporte) entre o cliente e o gateway de API. Você pode configurar o gateway do Gerenciamento de API para permitir somente solicitações com certificados que contenham uma impressão digital específica. A autorização no nível do gateway é manipulada por meio de políticas de entrada.

Autenticação do cliente da Segurança da Camada de Transporte

Com a autenticação de cliente TLS, o gateway do Gerenciamento de API pode inspecionar o certificado contido na solicitação do cliente e verificar propriedades como:

Propriedade Descrição
AC (autoridade de certificação) Permitir apenas certificados assinados por uma AC específica
Impressão Digital Permitir certificados que contenham uma impressão digital especificada
Entidade Permitir somente certificados com uma entidade especificada
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, especifique que o certificado passado na solicitação está assinado e não expirou.

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

  • Verificar quem emitiu o certificado. Se o emissor for uma autoridade de certificação confiável, você poderá usar o certificado. Você pode configurar autoridades de certificação confiáveis no portal do Azure para automatizar esse processo.
  • Se o certificado for emitido pelo parceiro, verifique se ele é proveniente dele. Por exemplo, se ele entregar o certificado pessoalmente, você poderá ter certeza de sua autenticidade. Eles são conhecidos como certificados autoassinados.

Como aceitar certificados do cliente na camada Consumo

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

Configurar o gateway para solicitar certificados

Políticas de Autorização de Certificado

Crie essas políticas no arquivo de política de processamento de entrada no gateway do Gerenciamento de API:

Botão da política de processamento de entrada

Verificar a impressão digital de um certificado do cliente

Todos os certificados do cliente incluem uma impressão digital, que é um hash, calculado com base em outras propriedades do certificado. A impressão digital garante que os valores no certificado não foram alterados, pois o certificado foi emitido pela autoridade de certificação. Você pode verificar a impressão digital na política. O seguinte exemplo verifica a impressão digital do certificado passado na solicitação:

<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 a impressão digital em relação aos certificados carregados no Gerenciamento de API

No exemplo anterior, somente uma impressão digital funcionará e, portanto, apenas um certificado será validado. Normalmente, cada cliente ou empresa parceira passará um certificado diferente com uma impressão digital diferente. Para dar suporte a esse cenário, obtenha os certificados de seus parceiros e use a página Certificados do cliente no portal do Azure para carregá-los no recurso do Gerenciamento de API. Em seguida, adicione este código à 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 a entidade de um certificado do cliente

Este exemplo verifica o emissor e a entidade do certificado passado na solicitação:

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