Exercício – utilizar certificados de cliente para proteger o acesso a uma API

Concluído

Pode configurar a Gestão de API para aceitar certificados de cliente ao utilizar políticas de entrada.

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

Nesta unidade, irá:

  • Criar um certificado autoassinado
  • Configurar o gateway para pedir certificados de cliente
  • Obter o thumbprint para o certificado
  • Edite a política de entrada para permitir apenas os clientes com o certificado especificado no respetivo pedido
  • Chame o gateway de Gestão de API e transmita o certificado ao utilizar o curl

Nota

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 autenticação entre o cliente e o gateway de Gerenciamento de API.

  1. Para criar a chave privada e o certificado, execute os seguintes comandos no Cloud Shell.

    pwd='<Enter a secure password here>'
    pfxFilePath='selfsigncert.pfx'
    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out selfsigncert.crt -subj /CN=localhost
    

    Para tornar este exemplo fácil de seguir, os comandos anteriores incluem a senha usada para proteger a chave privada. Sempre que você gerar uma chave privada para seu próprio uso, certifique-se de gerar uma senha segura e controlar o acesso a ela adequadamente.

  2. Agora, converta o certificado para o formato PEM, que a curl ferramenta pode usar, executando 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 lhe for pedido, introduza a sua palavra-passe segura e, em seguida, prima Enter.

Configurar o gateway para pedir certificados de cliente

Como você está usando a camada de Consumo para Gerenciamento de API, deve configurar o gateway para aceitar certificados de cliente. Siga estes passos.

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

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

  3. Para *Solicitar certificado de cliente, selecione Sim e, na barra de menu superior, selecione Salvar.

    Configure o gateway para solicitar certificados.

Obter o thumbprint para o certificado

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

Nota

Uma impressão digital de certificado SSL também é conhecida como impressão digital de certificado SSL.

  1. No Cloud Shell, execute o código a seguir.

    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 a política de entrada para apenas permitir pedidos com um certificado válido

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

  1. No portal do Azure, selecione seu serviço de Gerenciamento de API. Se necessário, no menu de recursos do Azure ou na home page, selecione Todos os recursos e, em seguida, selecione o serviço de Gerenciamento de API.

  2. No painel de menu esquerdo, em APIs, selecione APIs. O painel APIs do seu serviço de Gerenciamento de API é exibido.

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

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

    Botão da política de processamento de entrada.

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

    <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. Selecione Guardar.

Chamar o gateway e transmitir o certificado de cliente

Agora 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 no 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]' 
    

    Este comando deverá devolver um erro 403 Certificado de Cliente e não serão devolvidos dados.

  2. No Cloud Shell, para testar a API com o certificado, copie e cole o seguinte comando cURL, usando a chave de assinatura primária do primeiro exercício (você também pode obter essa chave primária no painel Assinaturas para seu serviço de Gerenciamento de API 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
    

    Este comando deve resultar em uma resposta bem-sucedida exibindo dados meteorológicos semelhantes aos seguintes.

    {"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}