Proteger APIs usando certificados
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.
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:
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>