Exercício – Usar certificados do cliente para proteger o acesso a uma API

Concluído

Você configurará o Gerenciamento de API para aceitar certificados do cliente usando políticas de entrada.

Suponha que sua empresa de clima tenha decidido proteger a API por meio da autenticação de certificado para determinados clientes que já usam a autenticação de certificado em outros sistemas. Essa configuração permitirá que os clientes usem seus certificados existentes para se autenticarem no gateway do Gerenciamento de API.

Nesta unidade, você vai:

  • Criará um certificado autoassinado
  • Configurará o gateway para solicitar certificados do cliente
  • Obterá a impressão digital do certificado
  • Editará a política de entrada para permitir somente clientes com o certificado especificado na solicitação
  • Chamará o gateway do Gerenciamento de API e passará o certificado usando curl

Observação

Este exercício usa os recursos que você configurou no exercício anterior.

Criar certificado autoassinado

Primeiro, use o Cloud Shell para criar um certificado autoassinado, que você usará para a autenticação entre o cliente e o gateway do Gerenciamento de API.

  1. Execute os comandos a seguir no Cloud Shell para criar uma chave privada e um certificado.

    pwd='Pa$$w0rd'
    pfxFilePath='selfsigncert.pfx'
    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out selfsigncert.crt -subj /CN=localhost
    

    Para facilitar a compreensão deste exemplo, os comandos anteriores incluem a senha usada para proteger a chave privada. Sempre que você gerar uma chave privada para seu próprio uso, lembre-se de gerar uma senha segura e controlar o acesso a ela de modo adequado.

  2. Agora, converta o certificado para o formato PEM, que pode ser usado pela ferramenta curl ao executar estes comandos:

    openssl pkcs12 -export -out $pfxFilePath -inkey privateKey.key -in selfsigncert.crt -password pass:$pwd
    openssl pkcs12 -in selfsigncert.pfx -out selfsigncert.pem -nodes
    

    Quando receber a solicitação de senha, digite Pa$$w0rd e pressione Enter.

Configurará o gateway para solicitar certificados do cliente

Como você está usando a camada Consumo para o Gerenciamento de API, precisará configurar o gateway para aceitar certificados do cliente. Siga estas etapas.

  1. No portal do Azure que já está aberto, selecione o serviço de Gerenciamento de API (APIM-WeatherDataNNNN).

  2. No painel de menu à esquerda, em Implantação e infraestrutura, selecione Domínios personalizados. O painel Domínios personalizados é exibido para o serviço de Gerenciamento de API.

  3. Para a opção Solicitar certificado do cliente, selecione Sim e, na barra de menus superior, selecione Salvar.

    Configure the gateway to request certificates.

Obter a impressão digital do certificado

Nesta seção, você vai configurar o Gerenciamento de API para aceitar uma solicitação somente se ela tiver um certificado com determinada impressão digital. Vamos obter essa impressão digital do certificado.

Observação

Uma impressão digital do certificado SSL também é conhecida com o identificador único do certificado SSL.

  1. Execute o código a seguir no Cloud Shell.

    Fingerprint="$(openssl x509 -in selfsigncert.pem -noout -fingerprint)"
    Fingerprint="${Fingerprint//:}"
    echo ${Fingerprint#*=}
    
  2. Copie a saída completa (uma cadeia de caracteres hexadecimal) e cole esse valor de impressão digital em um arquivo de texto.

Editar política de entrada para permitir somente solicitações com um certificado válido

Agora, crie a política de autenticação no gateway do Gerenciamento de API.

  1. No portal do Azure, selecione o serviço de Gerenciamento de API. Se necessário, no menu de recursos do Azure, ou na página Início, selecione Todos os recursos e, em seguida, selecione o serviço de Gerenciamento de API.

  2. No painel do menu à esquerda, em APIs, selecione APIs. O painel APIs será exibido para o serviço de Gerenciamento de API.

  3. No menu secundário, selecione Dados Meteorológicos.

  4. Na caixa Processamento de entrada, selecione o ícone </> para abrir Editor de código de políticas. O código HTML para o nó de políticas é exibido.

    Inbound processing policy button.

  5. Substitua o nó <inbound> do arquivo de política pelo seguinte XML, substituindo a impressão digital que você copiou anteriormente pelo espaço reservado desired-fingerprint:

    <inbound>
        <choose>
            <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-fingerprint")" >
                <return-response>
                    <set-status code="403" reason="Invalid client certificate" />
                </return-response>
            </when>
        </choose>
        <base />
    </inbound>
    
  6. Clique em Salvar.

Chamar o gateway e passar o certificado do cliente

Você pode testar a nova política de autenticação com e sem o certificado.

  1. Para testar a API sem o certificado, execute o seguinte comando em Cloud Shell, substituindo os valores de espaço reservado pelo nome do gateway de API e pela chave de assinatura.

    curl -X -v GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \
      -H 'Ocp-Apim-Subscription-Key: [Subscription Key]' 
    

    Esse comando deverá retornar um erro 403 Certificado do cliente e nenhum dado será retornado.

  2. No Cloud Shell, para testar a API com o certificado, copie e cole o comando cURL a seguir, usando a chave de assinatura primária do primeiro exercício (você também pode obter essa chave primária no painel Assinaturas para o serviço de Gerenciamento de API do WeatherData). Lembre-se de incluir o nome do gateway de API.

    curl -X GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \
      -H 'Ocp-Apim-Subscription-Key: [subscription-key]' \
      --cert-type pem \
      --cert selfsigncert.pem
    

    Esse comando deverá resultar em uma resposta bem-sucedida, exibindo dados de clima semelhantes ao código mostrado a seguir.

    {"mainOutlook":{"temperature":32,"humidity":34},"wind":{"speed":11,"direction":239.0},"date":"2019-05-16T00:00:00+00:00","latitude":53.0,"longitude":-1.0}