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