Protección de las API mediante certificados

Completado

Los certificados se pueden usar para proporcionar autenticación mutua de seguridad de la capa de transporte (TLS) entre el cliente y la puerta de enlace de API. Puede configurar la puerta de enlace de API Management para permitir solamente las solicitudes con certificados que contengan una huella digital específica. La autorización en el nivel de puerta de enlace se controla mediante directivas de entrada.

Autenticación de cliente de seguridad de la capa de transporte

Con la autenticación de clientes TLS, la puerta de enlace de API Management puede inspeccionar el certificado incluido en la solicitud de cliente y comprobar propiedades como las siguientes:

Propiedad Descripción
Entidad de certificación (CA) Solo se permiten certificados firmados por una CA concreta.
Huella digital Se permiten certificados que contengan una huella digital especificada.
Asunto Solo se permiten certificados con un asunto especificado.
Fecha de expiración No permitir certificados expirados

Estas propiedades no son mutuamente excluyentes y se pueden combinar entre sí para formar requisitos de directiva propios. Por ejemplo, puede especificar que el certificado pasado en la solicitud está firmado y no ha expirado.

Los certificados de cliente se firman para garantizar que no se hayan modificado. Cuando un asociado envía un certificado, compruebe que proviene de él y no de un impostor. Hay dos formas habituales de comprobar un certificado:

  • Compruebe quién ha emitido el certificado. Si el emisor ha sido una entidad de certificación en la que confía, puede usar el certificado. Para automatizar este proceso puede configurar las entidades de certificación de confianza en Azure Portal.
  • Si el certificado lo ha emitido el asociado, compruebe que procede de él. Por ejemplo, si entrega el certificado en persona, puede estar seguro de su autenticidad. Estos se conocen como certificados autofirmados.

Aceptación de certificados de cliente en el plan de consumo

El plan Consumo de API Management está diseñado para cumplir con los principios de diseño sin servidor. Si compila las API desde tecnologías sin servidor, como Azure Functions, este nivel es una buena opción. En el plan Consumo, debe habilitar de forma explícita el uso de certificados de cliente, lo que puede hacer en la página Dominios personalizados. Este paso no es necesario en otros niveles.

Configuración de la puerta de enlace para solicitar certificados

Directivas de autorización de certificado

Cree estas directivas en el archivo de directiva de procesamiento de entrada dentro de la puerta de enlace de API Management:

Botón de la directiva de procesamiento de entrada

Comprobación de la huella digital de un certificado de cliente

Todos los certificados de cliente incluyen una huella digital, que es un hash que se calcula a partir de otras propiedades del certificado. La huella digital garantiza que los valores del certificado no se han alterado desde que la entidad emisora de certificados lo ha emitido. Puede comprobar la huella digital en la directiva. En el ejemplo siguiente se comprueba la huella digital del certificado que se ha pasado en la solicitud:

<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>

Comprobación de la huella digital en relación con certificados cargados en API Management

En el ejemplo anterior, solo funcionaría una huella digital, por lo que solo se validaría un certificado. Normalmente, cada cliente o empresa asociada pasaría un certificado diferente con una huella digital distinta. Para admitir este escenario, obtenga los certificados de los asociados y use la página Certificados de cliente de Azure Portal para cargarlos en el recurso de API Management. Después, agregue este código a la directiva:

<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>

Comprobar el emisor y el firmante de un certificado de cliente.

En este ejemplo se comprueba el emisor y el sujeto del certificado que se ha pasado en la solicitud:

<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>