Ejercicio: Uso de certificados de cliente para proteger el acceso a una API

Completado

Configurará API Management para que acepte certificados de cliente mediante el uso de directivas de entrada.

Supongamos que la empresa meteorológica ha decidido proteger su API mediante la autenticación de certificados para determinados clientes que ya usan la autenticación de certificados en otros sistemas. Esta configuración permitirá a esos clientes usar certificados existentes para autenticarse en la puerta de enlace de API Management.

En esta unidad aprenderá a:

  • Crear un certificado autofirmado
  • Configurar la puerta de enlace para solicitar certificados de cliente
  • Obtener la huella digital del certificado
  • Editar la directiva de entrada para permitir solo clientes con el certificado especificado en la solicitud
  • Llamar a la puerta de enlace de API Management y pasar el certificado mediante curl

Nota:

En este ejercicio se usan los recursos que ha configurado en el ejercicio anterior.

Crear certificado autofirmado

En primer lugar, utilice Cloud Shell para crear un certificado autofirmado, que usará posteriormente para la autenticación entre el cliente y la puerta de enlace de API Management.

  1. Para crear la clave privada y el certificado, ejecute los siguientes comandos en Cloud Shell.

    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 que este ejemplo sea fácil de seguir, los comandos anteriores incluyen la contraseña que se usa para proteger la clave privada. Cada vez que genere una clave privada para uso propio, asegúrese de generar una contraseña segura y controlar el acceso a ella de forma adecuada.

  2. Ahora, convierta el certificado a formato PEM, que la herramienta curl pueda usar; para ello, ejecute estos comandos:

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

    Cuando se le pida una contraseña, escriba Pa$$w0rd y presione Entrar.

Configurar la puerta de enlace para solicitar certificados de cliente

Como va a usar el nivel de consumo para API Management, tendrá que configurar la puerta de enlace para que acepte certificados de cliente. Siga estos pasos.

  1. En la instancia de Azure Portal que ya está abierta, seleccione el servicio de API Management (apim-WeatherDataNNNNN).

  2. En el panel de menús de la izquierda, en Implementación e infraestructura, seleccione Dominios personalizados. Aparecerá el panel Dominios personalizados para el servicio API Management.

  3. En *Solicitar certificado de cliente, seleccione y, en la barra de menús superior, elija Guardar.

    Configure the gateway to request certificates.

Obtención de la huella digital del certificado

En esta sección, configurará API Management para que acepte una solicitud solo si tiene un certificado con una huella digital determinada. Vamos a obtener esa huella digital del certificado.

Nota:

Una huella digital de certificado SSL también se conoce como huella digital de certificado SSL.

  1. Ejecute el código siguiente en Cloud Shell.

    Fingerprint="$(openssl x509 -in selfsigncert.pem -noout -fingerprint)"
    Fingerprint="${Fingerprint//:}"
    echo ${Fingerprint#*=}
    
  2. Copie la salida completa (una cadena hexadecimal) y pegue este valor de huella digital en un archivo de texto.

Edición de la directiva de entrada para permitir solo solicitudes con un certificado válido

Ahora, cree la directiva de autenticación en la puerta de enlace de API Management.

  1. En Azure Portal, seleccione el servicio API Management. Si es necesario, en el menú de recursos de Azure Portal o desde la página Inicio, seleccione Todos los recursos y luego el servicio API Management.

  2. En el panel de menús de la izquierda, en API, seleccione API. Aparece el panel API del servicio de API Management.

  3. En el menú secundario, seleccione Weather Data.

  4. En el cuadro Procesamiento de entrada, seleccione el icono </> para abrir el Editor de código de directivas. Se mostrará el código HTML del nodo de directivas.

    Inbound processing policy button.

  5. Reemplace el nodo <inbound> del archivo de directiva con el código XML siguiente, y sustituya la huella digital que ha copiado antes por el marcador de posición 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. Seleccione Guardar.

Llamada a la puerta de enlace y envío del certificado de cliente

Ahora puede probar la nueva directiva de autenticación con y sin el certificado.

  1. Para probar la API sin el certificado, ejecute el siguiente comando en Cloud Shell, reemplazando los valores de marcador de posición por el nombre de la puerta de enlace de API y la clave de suscripción.

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

    Este comando debe devolver un error 403 de certificado de cliente, y no se devolverá ningún dato.

  2. En Cloud Shell, para probar la API con el certificado, copie y pegue el siguiente comando cURL con la clave de suscripción principal del primer ejercicio (también puede obtener esta clave principal en el panel Suscripciones del servicio WeatherData de API Management). No olvide incluir el nombre de la puerta de enlace de la 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 debe dar como resultado una respuesta correcta que muestre datos meteorológicos parecidos a los siguientes.

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