Autenticación mutua de TLS

Por lo general, con la comunicación HTTPS, la autenticación funciona solo de una manera: el cliente verifica la identidad del servidor.

En las aplicaciones que requieren que el balanceador de cargas autentique la identidad de los clientes que se conectan a él, usa la TLS mutua (mTLS).

Con la mTLS, el balanceador de cargas solicita que el cliente envíe un certificado para autenticarse durante el protocolo de enlace TLS con el balanceador de cargas. Puedes configurar un almacén de confianza que el balanceador de cargas use para validar la cadena de confianza del certificado de cliente.

Los siguientes balanceadores de cargas de aplicaciones son compatibles con mTLS:

  • Balanceador de cargas de aplicaciones externo global
  • Balanceador de cargas de aplicaciones clásico
  • Balanceador de cargas de aplicaciones regional externo regional (versión previa)
  • Balanceador de cargas de aplicaciones interno regional (vista previa)
  • Balanceador de cargas de aplicaciones interno entre regiones

Arquitectura

Los siguientes recursos son necesarios para que los balanceadores de cargas admitan una implementación de autenticación de mTLS:

  • Un recurso de política de TLS de servidor (ServerTLSPolicy). Te permite especificar el modo de TLS del servidor y el recurso TrustConfig que se usarán cuando se validen certificados de cliente. Las políticas de TLS del servidor admiten la autenticación mTLS. Las políticas de TLS del servidor se pueden adjuntar al recurso del proxy HTTPS de destino.

  • Un recurso TrustConfig. Un recurso del Administrador de certificados. TrustConfig contiene un único recurso de almacén de confianza que se usa para validar certificados de cliente. Para obtener más información, consulta Administra las configuraciones de confianza.

    Puedes subir certificados incluidos en la lista de entidades permitidas a TrustConfig. Un certificado incluido en la lista de entidades permitidas siempre se considera válido siempre que se pueda analizar, siempre que se establezca una prueba de posesión de la clave privada y se cumplan las restricciones en el campo SAN del certificado. Los certificados vencidos también se consideran válidos cuando se incluyen en la lista de entidades permitidas.

  • Un almacén de confianza. Contiene los certificados de ancla de confianza y de la autoridad certificadora (CA) intermedia que se usan para validar la cadena de certificados de cliente. Una CA se usa a fin de emitir certificados de confianza para el cliente. La CA se identifica mediante el certificado raíz de anclaje de confianza del balanceador de cargas o los certificados de CA intermedios.

    Puedes subir los siguientes tipos de certificados de cliente al almacén de confianza:

En la siguiente imagen, se muestran los componentes de mTLS:

global

En el siguiente diagrama, se muestran los componentes de una implementación de balanceador de cargas de aplicaciones externo. Esta arquitectura también se aplica al balanceador de cargas de aplicaciones interno entre regiones, que es un balanceador de cargas de aplicaciones interno que usa componentes globales.

TLS mutua con componentes del balanceador de cargas de aplicaciones externo global.
Figura 1. TLS mutua con componentes del balanceador de cargas de aplicaciones externo global (haz clic para ampliar).

regional

En el siguiente diagrama, se muestran los componentes de una implementación del balanceador de cargas de aplicaciones interno regional. Esta arquitectura también se aplica al balanceador de cargas de aplicaciones externo regional, que es un balanceador de cargas de aplicaciones externo que usa componentes regionales.

TLS mutua con componentes del balanceador de cargas de aplicaciones interno regional.
Figura 1. TLS mutua con componentes del balanceador de cargas de aplicaciones interno regional (haz clic para ampliar).

Para obtener más información sobre los componentes de una implementación del balanceador de cargas de aplicaciones, consulta las siguientes secciones:

Funciones

Las funciones compatibles con mTLS para los balanceadores de cargas te permiten hacer lo siguiente:

  • Verifica la prueba de posesión de la clave privada del certificado que presenta el cliente.

  • Valida los certificados de cliente en cualquiera de estos dos modos:

    • Rechaza las solicitudes si no podemos validar la cadena de certificados de cliente en un almacén de confianza.
    • Pasa todas las solicitudes al backend, incluso si no proporcionan un certificado de cliente.
  • Realiza la validación del certificado de cliente con un ancla de PKI subida. Admite la adición de varias anclas de PKI por separado para facilitar una migración sin tiempo de inactividad desde una PKI antigua a una nueva.

  • Proporciona certificados intermedios adicionales que se usarán para la compilación de la ruta de validación en las anclas de la PKI especificadas. Los certificados intermedios te permiten usar mTLS con clientes que no pasan la cadena de certificados completa.

  • Genera y pasa una huella digital del certificado al backend como un encabezado de solicitud personalizado.

  • Pasa los campos seleccionados extraídos del certificado al backend mediante encabezados de solicitud personalizados.

  • Pasa el resultado de la validación y cualquier error de validación al backend mediante los encabezados de solicitud personalizados.

Para obtener una descripción más detallada del proceso de validación, consulta la sección Pasos para la validación del certificado de cliente más adelante en esta página.

Modos de validación de cliente de MTLS

Cuando el cliente presenta un certificado no válido o ningún certificado al balanceador de cargas, clientValidationMode especifica cómo se maneja la conexión del cliente.

Los valores de clientValidationMode son los siguientes:

  • ALLOW_INVALID_OR_MISSING_CLIENT_CERT permite la conexión desde el cliente, incluso si la validación de la cadena de certificados del certificado de cliente falló o no se presentó ningún certificado de cliente. La prueba de posesión de la clave privada siempre se verifica cuando se presenta el certificado de cliente.

    Puedes usar variables de encabezado personalizadas con este modo para indicar al backend si el cliente proporcionó un certificado, si la validación se realizó correctamente y otra información extraída del certificado.

  • REJECT_INVALID rechaza la conexión si un cliente no proporciona un certificado o si falló la validación del certificado.

Puedes ver registros de la validación del certificado de cliente mTLS cuando el registro está habilitado en el servicio de backend.

Valores de encabezado personalizados que se pasan al backend

En la siguiente tabla, se muestran todos los valores de las variables del encabezado personalizado de TLS mutua que siempre se pasan al backend (tipo de solicitud “Pasar solicitud al backend”). Los encabezados personalizados se pasan al backend cuando clientValidationMode se establece como ALLOW_INVALID_OR_MISSING_CLIENT_CERT o cuando el certificado de cliente pasa la validación del certificado.

Estado del certificado de cliente clientValidationMode Encabezados personalizados

La cadena de certificados de cliente es demasiado larga (se incluyen más de 10 certificados intermedios con el certificado de cliente).

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_exceeded_limit

client_cert_sha256_fingerprint: <cert hash>

Un cliente o certificado intermedio tiene un tamaño de clave RSA no válido.

No se realiza ninguna validación.

Las claves RSA pueden ser de 2048 a 4096 bits.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_invalid_rsa_key_size

client_cert_sha256_fingerprint: <cert hash>

Un cliente o un certificado intermedio usa una curva elíptica no compatible.

No se realiza ninguna validación.

Las curvas elípticas válidas son P-256 y P-384.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_unsupported_elliptic_curve_key

client_cert_sha256_fingerprint: <cert hash>

Un cliente o un certificado intermedio usa un algoritmo que no es de RSA ni ECEC.

No se realiza ninguna validación.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_unsupported_key_algorithm

client_cert_sha256_fingerprint: <cert hash>

La PKI que se usará para la validación tiene más de diez certificados intermedios que comparten la misma información de la entidad y la clave pública de la entidad.

No se realiza ninguna validación.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_pki_too_large

client_cert_sha256_fingerprint: <cert hash>

Un certificado intermedio proporcionado para la validación tenía más de 10 restricciones de nombres.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_max_name_constraints_exceeded

client_cert_sha256_fingerprint: <cert hash>

El certificado de cliente o su entidad emisora no tiene Extended Key Usage (EKU) que incluya clientAuth.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_invalid_eku

client_cert_sha256_fingerprint: <cert hash>

Se excede el límite de tiempo mientras se intenta validar la cadena de certificados. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_timed_out

client_cert_sha256_fingerprint: <cert hash>

Se alcanza el límite de iteración o profundidad mientras se intenta validar la cadena de certificados.

La profundidad máxima de una cadena de certificados es de diez, incluidos los certificados raíz y de cliente. La cantidad máxima de iteraciones es de 100 (certificados examinados para validar la cadena de certificados de cliente).

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_search_limit_exceeded

client_cert_sha256_fingerprint: <cert hash>

Configuraste mTLS sin configurar un recurso TrustConfig.

No se puede realizar ninguna validación, pero el hash del certificado se reenvía al backend.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_not_performed

client_cert_sha256_fingerprint: <cert hash>

Sin certificado de cliente. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: false

client_cert_chain_verified: false

client_cert_error: client_cert_not_provided

client_cert_sha256_fingerprint: <empty>

El certificado de cliente falla con la validación del recurso TrustConfig. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_failed

client_cert_sha256_fingerprint: <cert hash>

El certificado de cliente pasa la validación del verificador de certificados. No aplicable

client_cert_present: true

client_cert_chain_verified: true

client_cert_error: <empty>

client_cert_sha256_fingerprint: <cert hash>

client_cert_serial_number: <serial_number>

client_cert_valid_not_before: <date>

client_cert_valid_not_after: <date>

client_cert_uri_sans: <list>

client_cert_dnsname_sans: <list>

client_cert_issuer_dn: <issuer>

client_cert_subject_dn: <subject>

client_cert_leaf: <certificate>

client_cert_chain: <list>

Errores registrados para conexiones cerradas

Los siguientes errores dan como resultado una conexión de cliente cerrada cuando clientValidationMode se establece en ALLOW_INVALID_OR_MISSING_CLIENT_CERT o REJECT_INVALID. Para obtener más información, consulta mensajes de error HTTP de statusDetails. Estos errores se registran en Cloud Logging y se describen en la siguiente tabla.

Estado del certificado de cliente Solicitud Error registrado
El certificado de cliente falla en la coincidencia de firma durante el protocolo de enlace. Finaliza el protocolo de enlace SSL Ninguno
El servicio no puede realizar la validación de la cadena de certificados. Finalizar conexión client_cert_validation_unavailable
Cadena de certificados de validación de errores internos. Finalizar conexión client_cert_validation_internal_error
No se encontró la TrustConfig coincidente. Finalizar conexión client_cert_trust_config_not_found
La carga útil del certificado de cliente (incluidos los certificados intermedios) es demasiado grande (más de 16 KB). Finalizar conexión client_cert_exceeded_size_limit

Errores registrados con la validación de REJECT_INVALID

Los siguientes errores dan como resultado una conexión cerrada (tipo de solicitud “Finalizar conexión”) cuando clientValidationMode se establece en REJECT_INVALID. Para obtener más información, consulta mensajes de error HTTP de statusDetails. Estos errores se registran en Cloud Logging y se describen en la siguiente tabla.

Estado del certificado de cliente Error registrado
La cadena de certificados de cliente es demasiado larga (se incluyen más de 10 certificados intermedios con el certificado de cliente). client_cert_chain_exceeded_limit

Un cliente o certificado intermedio tiene un tamaño de clave RSA no válido.

No se realiza ninguna validación.

Las claves RSA pueden ser de 2048 a 4096 bits.

client_cert_invalid_rsa_key_size

Un cliente o un certificado intermedio usa una curva elíptica no compatible.

No se realiza ninguna validación.

Las curvas válidas son P-256 y P-384.

client_cert_unsupported_elliptic_curve_key

Un cliente o un certificado intermedio usa un algoritmo que no es de RSA ni ECEC.

No se realiza ninguna validación.

client_cert_unsupported_key_algorithm

La PKI que se usará para la validación tiene más de diez certificados intermedios que comparten la misma información de la entidad y la clave pública de la entidad.

No se realiza ninguna validación.

client_cert_pki_too_large

Un certificado intermedio proporcionado para la validación tenía más de 10 restricciones de nombres.

client_cert_chain_max_name_constraints_exceeded

El certificado de cliente o su entidad emisora no tiene Extended Key Usage (EKU) que incluya clientAuth.

client_cert_chain_invalid_eku

Se excede el límite de tiempo mientras se intenta validar la cadena de certificados. client_cert_validation_timed_out

Se alcanza el límite de iteración o profundidad mientras se intenta validar la cadena de certificados.

La profundidad máxima de una cadena de certificados es de diez, incluidos los certificados raíz y de cliente. La cantidad máxima de iteraciones es 100 (certificados examinados para validar la cadena del certificado de cliente).

client_cert_validation_search_limit_exceeded
Configuraste mTLS sin configurar un recurso TrustConfig. client_cert_validation_not_performed
El cliente no proporcionó el certificado solicitado durante el protocolo de enlace. client_cert_not_provided
El certificado de cliente falla la validación con el recurso TrustConfig. client_cert_validation_failed

Pasos para la validación del certificado de cliente

Cuando valides un certificado de cliente, el balanceador de cargas sigue estos pasos:

  1. El balanceador de cargas verifica la firma del cliente para demostrar que el cliente posee la clave privada del certificado de cliente. Si este paso falla, el balanceador de cargas siempre falla en el protocolo de enlace TLS, incluso si la configuración permite certificados de cliente no válidos o faltantes, y no se registra información.
  2. Si la configuración incluye un TrustAnchor, el balanceador de cargas verifica una cadena de confianza entre el certificado de cliente y el TrustAnchor configurado. En específico, el balanceador de cargas verifica lo siguiente:
    • Los certificados raíz, intermedios y de cliente cumplen con los requisitos de certificado.
    • El campo del asunto en los certificados superiores coincide con el campo de emisión en los certificados secundarios.
    • El identificador de clave de asunto (SKID) del certificado superior coincide con el identificador de clave de autoridad (AKID) del certificado secundario.
    • El SAN de un certificado secundario no infringe el campo NameConstraints en el certificado superior.
  3. Si la verificación de la cadena de confianza tiene éxito, la solicitud se reenvía al backend con cualquier encabezado personalizado mTLS configurado para el extremo.
  4. Si la verificación de la cadena de confianza falla, haz lo siguiente:
    • Si ClientValidationMode se configura como REJECT_INVALID, el balanceador de cargas finaliza la conexión y registra el motivo en Cloud Logging.
    • Si ClientValidationMode se configura como ALLOW_INVALID_OR_MISSING_CLIENT_CERTIFICATE, el balanceador de cargas aún reenvía la solicitud al backend. Puedes usar encabezados de solicitud personalizados para indicar al backend que la validación falló y el motivo de la falla. Para los balanceadores de cargas de aplicaciones internos entre regiones, los balanceadores de cargas de aplicaciones externos regionales o los balanceadores de cargas de aplicaciones internos regionales, además de los encabezados de solicitud personalizados, puedes configurar campos opcionales mTLS para verificar el motivo de la falla.

Requisitos del certificado

  • Los certificados deben usar algoritmos de cifrado RSA o ECDSA.
  • Para certificados (de hoja) de cliente:
  • Para certificados raíz e intermedios, haz lo siguiente:
    • La extensión Restricciones básicas debe contener CA=true.
    • La extensión Uso de la clave se debe establecer en keyCertSign.
    • La extensión Uso extendido de la clave debe contener el campo clientAuth. Esto es necesario para el certificado que emite el certificado de cliente.
    • El certificado no debe estar vencido.

Limitaciones

  • El balanceador de cargas no realiza verificaciones de revocación en los certificados de cliente.

  • Los balanceadores de cargas de aplicaciones te permiten subir una configuración de confianza con un solo almacén de confianza que contenga como máximo 100 anclas de confianza y 100 certificados intermedios y 500 certificados incluidos en la lista de entidades permitidas. Todos los certificados intermedios no deben tener más de tres certificados que compartan la misma información de la entidad y la clave pública de la entidad. Para obtener más información, consulta Cuotas y límites.

  • La profundidad máxima de una cadena de certificados es de diez, incluidos los certificados raíz y de cliente. La cantidad máxima de veces que se pueden evaluar los certificados intermedios cuando se intenta compilar la cadena de confianza es 100. Para obtener más información, consulta Cuotas y límites.

  • Las claves de los certificados subidos y pasados del cliente están restringidas a lo siguiente:

    • Las claves RSA pueden ser de 2048 a 4096 bits. Para obtener más información, consulta Cuotas y límites.
    • Las claves ECDSA pueden usar las curvas P-256 o P-384.
  • La cadena de certificados aceptados que se recibe del cliente tiene un límite de hasta 16 KB y 10 certificados. Para obtener más información, consulta Cuotas y límites.

  • Los certificados raíz que se usan para la validación no pueden contener más de 10 restricciones de nombres. Para obtener más información, consulta Cuotas y límites.

  • El balanceador de cargas siempre considera que los certificados de cliente autofirmados no son válidos.

¿Qué sigue?