Configurar mTLS de backend

En esta página se explica cómo configurar mTLS de backend mediante certificados autogestionados para balanceadores de carga de aplicaciones externos globales.

Los pasos para configurar mTLS de backend son similares a los de TLS autenticado de backend, con la diferencia de que también debes crear un certificado para el balanceador de carga. Este certificado, también conocido como certificado de cliente, se adjunta al recurso Backend Authentication Config. El balanceador de carga usa este certificado de cliente para autenticarse en los backends.

Para configurar mTLS de backend, sigue los pasos que se indican en las siguientes secciones:

  1. Crea un recurso de configuración de confianza que incluya certificados raíz e intermedios.
  2. Crea un certificado de cliente y súbelo al Gestor de certificados.
  3. Crea un recurso Backend Authentication Config que haga referencia tanto a la configuración de confianza como al certificado de cliente.
  4. Asocia el recurso Backend Authentication Config al servicio de backend del balanceador de carga.

Antes de empezar

Permisos

En esta sección se indican los permisos necesarios para configurar mTLS de backend.
Operación Permiso
Crear una configuración de confianza certificatemanager.trustconfigs.create en el proyecto de destino Google Cloud
Crear certificado de cliente certificatemanager.certs.create en el proyecto de destino Google Cloud
Crear un recurso BackendAuthenticationConfig
  • certificatemanager.certs.use en el certificado de destino
  • certificatemanager.trustconfigs.use en la configuración de confianza de destino
  • networksecurity.backendauthenticationconfigs.create en el proyecto de destino Google Cloud
  • Asocia el recurso Backend Authentication Config al servicio de backend del balanceador de carga
  • compute.backendservice.update en el servicio de backend de destino
  • networksecurity.backendauthenticationconfigs.use en el recurso Backend Authentication Config de destino
  • Descripción general de la configuración

    En las secciones siguientes se describen los pasos para configurar mTLS de backend en función de la arquitectura que se muestra en el siguiente diagrama:

    Componentes de mTLS de backend.
    Componentes de mTLS de backend (haga clic para ampliar).

    Crear los certificados raíz e intermedio

    En esta sección se usa la biblioteca OpenSSL para crear el certificado raíz (ancla de confianza) y el certificado intermedio.

    Un certificado raíz se encuentra en la parte superior de la cadena de certificados. Un certificado intermedio forma parte de la cadena de confianza que lleva al certificado raíz. El certificado intermedio está firmado criptográficamente por el certificado raíz. Cuando el balanceador de carga recibe un certificado de servidor, lo valida estableciendo una cadena de confianza desde el certificado de servidor hasta el ancla de confianza configurada.

    Usa los siguientes comandos para crear los certificados raíz e intermedio.

    1. Crea un archivo de configuración de OpenSSL.

      En el siguiente ejemplo, el archivo de configuración (example.cnf) contiene la sección [ca_exts], que especifica las extensiones X.509 que marcan el certificado como adecuado para una AC. Para obtener más información sobre los requisitos de los certificados raíz e intermedios, consulta los requisitos de los certificados.

      cat > example.cnf << EOF
      [req]
      distinguished_name = empty_distinguished_name
      
      [empty_distinguished_name]
      # Kept empty to allow setting via -subj command-line argument.
      
      [ca_exts]
      basicConstraints=critical,CA:TRUE
      keyUsage=keyCertSign
      extendedKeyUsage=serverAuth
      
      EOF
      
    2. Crea un certificado raíz X.509 con firma automática (root.cert). El certificado raíz se firma automáticamente con su propia clave privada (root.key).

      openssl req -x509 \
          -new -sha256 -newkey rsa:2048 -nodes \
          -days 3650 -subj '/CN=root' \
          -config example.cnf \
          -extensions ca_exts \
          -keyout root.key -out root.cert
      
    3. Crea la solicitud de firma de certificado (CSR) int.req para el certificado intermedio.

      openssl req -new \
          -sha256 -newkey rsa:2048 -nodes \
          -subj '/CN=int' \
          -config example.cnf \
          -extensions ca_exts \
          -keyout int.key -out int.req
      
    4. Firma la CSR para crear el certificado intermedio X.509 (int.cert). La CSR se firma con el certificado raíz.

      openssl x509 -req \
          -CAkey root.key -CA root.cert \
          -set_serial 1 \
          -days 3650 \
          -extfile example.cnf \
          -extensions ca_exts \
          -in int.req -out int.cert
      

    Dar formato a los certificados

    Para incluir certificados nuevos o ya creados en un almacén de confianza, formatee los certificados en una sola línea y almacénelos en variables de entorno para que se puedan hacer referencia a ellos en el archivo YAML de configuración de confianza.

    export ROOT_CERT=$(cat root.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
    
    export INTERMEDIATE_CERT=$(cat int.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
    

    Crear un recurso de configuración de confianza

    Una configuración de confianza es un recurso que representa la configuración de tu infraestructura de clave pública (PKI) en Certificate Manager.

    Para crear un recurso de configuración de confianza, sigue estos pasos:

    Consola

    1. En la Google Cloud consola, ve a la página Gestor de certificados.

      Ir a Certificate Manager

    2. En la pestaña Configuraciones de confianza, haz clic en Añadir configuración de confianza.

    3. Introduce un nombre para la configuración.

    4. En Ubicación, selecciona Global. La ubicación indica dónde se almacena el recurso de configuración de confianza. En el caso de los balanceadores de carga de aplicación externos globales, debes crear un recurso de configuración de confianza global.

    5. En la sección Almacén de confianza, haz clic en Añadir ancla de confianza y sube el archivo de certificado codificado en PEM o copia el contenido del certificado.

    6. Haz clic en Añadir.

    7. En la sección Almacén de confianza, haz clic en Añadir AC intermedia y sube el archivo de certificado codificado en PEM o copia el contenido del certificado. Este paso te permite añadir otro nivel de confianza entre el certificado raíz y el certificado de tu servidor.

    8. Haz clic en Añadir para añadir la CA intermedia.

    9. Para añadir el certificado que has añadido a la lista de permitidos, haz clic en Añadir.

    10. Haz clic en Crear.

    Comprueba que el nuevo recurso de configuración de confianza aparezca en la lista de configuraciones.

    gcloud

    1. Crea un archivo YAML de configuración de confianza (trust_config.yaml) que especifique los parámetros de configuración de confianza. Este ejemplo de configuración de confianza resource contiene un almacén de confianza con un ancla de confianza y un certificado intermedio. Este recurso de configuración de confianza de ejemplo lee el contenido del certificado de las variables de entorno creadas en el paso anterior Formatear los certificados.

      cat << EOF > trust_config.yaml
      trustStores:
      - trustAnchors:
        - pemCertificate: "${ROOT_CERT}"
        intermediateCas:
        - pemCertificate: "${INTERMEDIATE_CERT}"
      EOF
      

      Para crear un almacén de confianza con anclas de confianza o certificados intermedios adicionales, añada filas pemCertificate en la sección correspondiente.

    2. Para importar el archivo YAML de configuración de confianza, usa el comando gcloud certificate-manager trust-configs import:

      En el caso de los balanceadores de carga de aplicación externos globales, especifica global como ubicación donde se almacena el recurso de configuración de confianza.

      gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME  \
          --source=trust_config.yaml \
          --location=global
      

      Haz los cambios siguientes:

      • TRUST_CONFIG_NAME: el nombre del recurso de configuración de confianza

    Crear certificado de cliente

    En mTLS de backend, el balanceador de carga actúa como cliente y el backend como servidor.

    Para habilitar la autenticación TLS mutua de backend, el balanceador de carga debe demostrar su identidad al backend. Esta autenticación se lleva a cabo mediante un certificado de cliente que el balanceador de carga presenta al backend. El servidor backend debe validar el certificado de cliente mediante su propia cadena de confianza.

    Cuando se conecta a un servidor backend, el balanceador de carga define el indicador del nombre de servidor (SNI) en el nombre de host especificado en la configuración de TLS. El servidor backend selecciona el certificado SSL/TLS adecuado en función de este valor de SNI. El balanceador de carga espera que el valor de SNI coincida con un nombre alternativo del sujeto (SAN) que figure en el certificado del servidor backend.

    Los certificados de cliente pueden ser certificados gestionados de una CA privada a través de Servicio de Autoridades de Certificación o certificados de PKI privada autogestionados. En este ejemplo, el certificado de cliente se emite mediante certificados autogestionados. En esta sección se usa la biblioteca OpenSSL para crear el certificado de CA raíz y el certificado de cliente.

    Para crear un certificado de cliente, sigue estos pasos:

    1. Crea un archivo de configuración de OpenSSL.

      En el siguiente ejemplo, el archivo de configuración (example.cnf) contiene la sección [ca_exts], que especifica las extensiones X.509 que marcan el certificado como adecuado para una autoridad de certificación (CA). El atributo extendedKeyUsage se ha definido como clientAuth. Para obtener más información sobre los requisitos de los certificados raíz e intermedios, consulte los requisitos de los certificados.

        cat > example.cnf << EOF
        [req]
        distinguished_name = empty_distinguished_name
      
        [empty_distinguished_name]
        # Kept empty to allow setting via -subj command-line argument.
      
        [ca_exts]
        basicConstraints=critical,CA:TRUE
        keyUsage=keyCertSign
        extendedKeyUsage=clientAuth
      
        EOF
      
    2. Crea un certificado de CA raíz X.509 autofirmado (root.cert). El certificado raíz se autofirma con su propia clave privada (root.key).

        openssl req -x509 \
            -new -sha256 -newkey rsa:2048 -nodes \
            -days 3650 -subj '/CN=root' \
            -config example.cnf \
            -extensions ca_exts \
            -keyout root.key -out root.cert
      
    3. Crea un archivo de configuración para generar la CSR del certificado de cliente.

      El siguiente archivo de configuración (client.config) contiene la sección [extension_requirements], que especifica las extensiones X.509 que se deben incluir en la CSR. Para obtener más información sobre los requisitos de los certificados de cliente, consulta Requisitos de los certificados.

        cat > client.config << EOF
        [req]
        default_bits              = 2048
        req_extensions            = extension_requirements
        distinguished_name        = dn_requirements
        prompt                    = no
      
        [extension_requirements]
        basicConstraints          = critical, CA:FALSE
        keyUsage                  = critical, nonRepudiation, digitalSignature, keyEncipherment
        extendedKeyUsage          = clientAuth
      
        [dn_requirements]
        countryName               = US
        stateOrProvinceName       = California
        localityName              = San Francisco
        0.organizationName        = example
        organizationalUnitName    = test
        commonName                = test.example.com
        emailAddress              = test@example.com
      
        EOF
      
    4. Crea la CSR (client.csr) del certificado de cliente.

        openssl req -new \
            -config client.config \
            -keyout client.key -out client.csr
      
    5. Crea el certificado de cliente (client.cert) a partir del CSR. La CSR está firmada por el certificado de la AC raíz para emitir el certificado de cliente X.509.

        openssl x509 -req \
            -CAkey root.key -CA root.cert \
            -days 365 \
            -extfile client.config \
            -extensions extension_requirements \
            -in client.csr -out client.cert
      

    Subir el certificado de cliente a Gestor de certificados

    Para subir el certificado de cliente a Gestor de certificados, sigue estos pasos:

    Consola

    1. En la Google Cloud consola, ve a la página Gestor de certificados.

      Ir a Certificate Manager

    2. En la pestaña Certificados, haz clic en Añadir certificado.

    3. Da un nombre al certificado.

      Este nombre debe ser único en el proyecto.

    4. Opcional: Escribe una descripción del certificado. La descripción te ayuda a identificar un certificado específico más adelante.

    5. En Ubicación, selecciona Global.

    6. En Ámbito, selecciona Autenticación de cliente.

    7. En Tipo de certificado, elige Crear certificado autogestionado.

    8. En el campo Certificado, suba un archivo de certificado codificado en PEM o copie y pegue el contenido de un certificado codificado en PEM.

    9. En el campo Certificado de clave privada, sube una clave privada codificada en PEM que no esté protegida con una contraseña o copia y pega el contenido de la clave privada codificada en PEM.

    10. Especifica una etiqueta que se asociará al certificado. Si es necesario, puedes añadir más de una etiqueta. Para añadir una etiqueta, haz clic en el botón Añadir etiqueta y especifica un key y un value para la etiqueta.

    11. Haz clic en Crear. Comprueba que el nuevo certificado aparezca en la lista de certificados.

    gcloud

    1. Para subir el certificado de cliente a Certificate Manager, usa el comando gcloud certificate-manager certificates create. El ámbito de este certificado es client-auth, lo que indica que se usa como certificado de cliente en mTLS de backend.

      gcloud certificate-manager certificates create CLIENT_ CERTIFICATE_NAME \
          --certificate-file=client.cert \
          --private-key-file=client.key \
          --scope=client-auth \
          --global
      

      Haz los cambios siguientes:

      • CLIENT_CERTIFICATE_NAME: nombre del recurso de certificado de cliente. El recurso Backend Authentication Config usa este certificado de cliente con el ámbito client-auth.

    Crear un recurso BackendAuthenticationConfig

    Para crear un recurso de configuración de autenticación de backend (BackendAuthenticationConfig), sigue estos pasos.

    Consola

    1. En la consola, ve a la página Configuración de autenticación. Google Cloud

      Ir a Configuración de autenticación

    2. En la pestaña Backend Authentication (Autenticación de backend), haz clic en Create (Crear).
    3. Introduce un nombre para el recurso Backend Authentication Config.
    4. Selecciona el recurso de certificado de cliente que has creado anteriormente.
    5. Opcional: selecciona las raíces de confianza públicas.
    6. Selecciona el recurso de configuración de confianza que has creado anteriormente.
    7. Haz clic en Crear.

    Verifica que se muestre el recurso Backend Authentication Config.

    gcloud

    1. Crea un archivo YAML que especifique de forma declarativa los distintos atributos del recurso Backend Authentication Config.

      Adjunta el certificado de cliente al recurso Backend Authentication Config para habilitar mTLS de backend.

      cat << EOF > BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME.yaml
      name: projects/PROJECT_ID/locations/global/backendAuthenticationConfigs/BACKEND_AUTH_CONFIG_NAME
      trustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      clientCertificate: projects/PROJECT_ID/locations/global/certificates/CLIENT_ CERTIFICATE_NAME
      wellKnownRoots: PUBLIC_ROOTS
      EOF
      

      Haz los cambios siguientes:

      • BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME : el nombre del archivo YAML en el que se define el recurso Backend Authentication Config.
      • PROJECT_ID: el ID de tu Google Cloud proyecto
      • BACKEND_AUTH_CONFIG_NAME: el nombre del recurso Backend Authentication Config
      • TRUST_CONFIG_NAME: el nombre del recurso de configuración de confianza que has creado anteriormente.
      • CLIENT_CERTIFICATE_NAME: el nombre del recurso de certificado de cliente que has creado anteriormente.
    2. Para importar el recurso Backend Authentication Config, usa el gcloud network-security backend-authentication-configs import comando:

      gcloud network-security backend-authentication-configs import BACKEND_AUTH_CONFIG_NAME \
         --source=BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME.yaml \
         --location=global
      

      Haz los cambios siguientes:

      • BACKEND_AUTH_CONFIG_NAME: nombre del recurso Backend Authentication Config

      • BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME: el nombre del archivo YAML en el que se define el recurso Backend Authentication Config.

    Asocia el recurso Backend Authentication Config al servicio de backend del balanceador de carga

    Para asociar el recurso Backend Authentication Config (BackendAuthenticationConfig) al servicio de backend del balanceador de carga, sigue estos pasos.

    Consola

    1. En la Google Cloud consola, ve a la página Balanceo de carga.

      Ir a Balanceo de carga

    2. En la pestaña Backends (Back-ends), selecciona el servicio de back-end para el que quieras habilitar TLS autenticado de back-end y mTLS de back-end.

    3. Haz clic en Editar.

    4. Despliega la sección Configuración avanzada.

    5. En la sección Autenticación de backend, selecciona la casilla Habilitar.

    6. Opcional: Especifica el nombre de host SNI y los SANs aceptados para validar el certificado de backend.

    7. Para adjuntar el recurso Backend Authentication Config al servicio de backend, en la lista Backend Authentication Config, selecciona el recurso Backend Authentication Config.

    8. Haz clic en Continuar.

    9. Para actualizar la configuración del servicio de backend, haz clic en Actualizar.

    gcloud

    1. Para enumerar todos los recursos de servicio backend de tu proyecto, usa el comando gcloud compute backend-services list.

      gcloud compute backend-services list
      

      Anota el nombre del servicio backend al que quieres adjuntar el recurso BackendAuthenticationConfig. En los pasos siguientes, nos referiremos a este nombre como BACKEND_SERVICE_NAME.

    2. Para exportar la configuración del servicio de backend a un archivo, usa el comando gcloud beta compute backend-services export.

      gcloud beta compute backend-services export BACKEND_SERVICE_NAME \
          --destination=BACKEND_SERVICE_FILENAME.yaml \
          --global
      

      Haz los cambios siguientes:

      • BACKEND_SERVICE_NAME: el nombre del servicio de backend
      • BACKEND_SERVICE_FILENAME: el nombre y la ruta de acceso de un archivo YAML en el que se exporta la configuración del servicio backend
    3. Actualice el atributo tlsSettings del servicio de backend para que apunte al recurso Backend Authentication Config. Además, puedes configurar el nombre de host SNI y los SANs aceptados en el servicio de backend para validar el certificado de backend.

        cat << EOF >> BACKEND_SERVICE_FILENAME.yaml
        tlsSettings:
          authenticationConfig: //networksecurity.googleapis.com/projects/PROJECT_ID/locations/global/backendAuthenticationConfigs/BACKEND_AUTH_CONFIG_NAME
          sni: examplepetstore.com
          subjectAltNames:
          - dnsName: examplepetstore.com
          - dnsName: api.examplepetstore.com
        EOF
        

      Los valores de SNI y SAN de la declaración YAML anterior son solo ejemplos. Puede sustituirlos por valores reales que sean relevantes para su configuración.

      Haz los cambios siguientes:

      • BACKEND_SERVICE_FILENAME: el nombre del archivo YAML en el que se exporta la configuración del servicio backend

      • PROJECT_ID: el ID de tu Google Cloud proyecto

      • BACKEND_AUTH_CONFIG_NAME: nombre del recurso Backend Authentication Config

    4. Para importar la configuración actualizada del servicio de backend desde un archivo, usa el comando gcloud beta compute backend-services import.

      gcloud beta compute backend-services import BACKEND_SERVICE_NAME \
          --source=BACKEND_SERVICE_FILENAME.yaml \
          --global
      

      Haz los cambios siguientes:

      • BACKEND_SERVICE_NAME: el nombre del servicio de backend
      • BACKEND_SERVICE_FILENAME: el nombre del archivo YAML de configuración del servicio backend

    Crear un certificado de servidor backend

    En esta sección se ofrece una opción de configuración adicional para crear un certificado de servidor (hoja) firmado por el certificado intermedio, que forma parte de la configuración de confianza. De esta forma, se puede establecer una cadena de confianza desde el certificado del servidor hasta el ancla de confianza.

    Si ya has creado un recurso de configuración de confianza que contiene un certificado intermedio, haz lo siguiente:

    1. Crea un archivo de configuración para generar la CSR del certificado de servidor.

      El siguiente archivo de configuración (server.config) contiene la sección [extension_requirements], que especifica las extensiones X.509 que se deben incluir en la CSR. Para obtener más información sobre los requisitos de los certificados de servidor, consulta Requisitos de los certificados.

      cat > server.config << EOF
      [req]
      default_bits              = 2048
      req_extensions            = extension_requirements
      distinguished_name        = dn_requirements
      prompt                    = no
      
      [extension_requirements]
      basicConstraints          = critical, CA:FALSE
      keyUsage                  = critical, nonRepudiation, digitalSignature, keyEncipherment
      extendedKeyUsage          = serverAuth
      subjectAltName            = @alt_names
      
      [alt_names]
      DNS.1 = examplepetstore.com
      DNS.2 = api.examplepetstore.com
      
      [dn_requirements]
      countryName               = US
      stateOrProvinceName       = California
      localityName              = San Francisco
      0.organizationName        = example
      organizationalUnitName    = test
      commonName                = examplepetstore.com
      emailAddress              = test@examplepetstore.com
      
      EOF
      
    2. Crea la CSR (server.csr) del certificado de servidor.

      openssl req -new \
          -sha256 -newkey rsa:2048 -nodes \
          -config server.config \
          -keyout server.key -out server.csr
      
    3. Firma la CSR para emitir el certificado de servidor X.509 (server.cert). La CSR está firmada por el certificado intermedio.

      openssl x509 -req \
          -CAkey int.key -CA int.cert \
          -days 365 \
          -extfile server.config \
          -extensions extension_requirements \
          -in server.csr -out server.cert
      

      Cuando el balanceador de carga se conecta al servidor backend, este presenta su certificado (server.cert) para autenticarse ante el balanceador de carga, lo que completa el proceso de autenticación del backend.

    Opciones de configuración SSL adicionales en un servidor web Apache

    En esta sección opcional se explica cómo actualizar las opciones de configuración de SSL en un servidor Apache en función de los certificados de cliente y servidor que hayas creado anteriormente.

    1. Copia la clave privada del servidor (server.key) y el certificado del servidor (server.cert) en el servidor web Apache.

          cat > server.key << EOF
          -----BEGIN PRIVATE KEY-----
          [...]
          -----END PRIVATE KEY-----
          EOF
      
          sudo cp ./server.key /etc/ssl/private/server.key
          

      Sustituye [...] por la clave privada del servidor codificada en PEM que has creado anteriormente.

          cat > server.cert << EOF
          -----BEGIN CERTIFICATE-----
          [...]
          -----END CERTIFICATE-----
          EOF
      
          sudo cp ./server.cert /etc/ssl/certs/server.cert
          

      Sustituye [...] por el certificado de servidor codificado en PEM que has creado anteriormente.

    2. Sube el certificado de cliente a la configuración de confianza del servidor para validar el certificado de cliente.

            cat > client.cert << EOF
            -----BEGIN CERTIFICATE-----
            [...]
            -----END CERTIFICATE-----
            EOF
      
            sudo cp ./client.cert /etc/ssl/certs/client.cert
            

      Sustituye [...] por el certificado de cliente codificado en PEM que has creado anteriormente.

    3. Actualiza la configuración de SSL del servidor web Apache.

      Actualiza la configuración SSL de Apache para habilitar el tráfico HTTPS mediante el certificado SSL y la clave privada especificados.

          sudo vi /etc/apache2/sites-available/default-ssl.conf
      
          ----
          SSLCertificateFile      /etc/ssl/certs/server.cert
          SSLCertificateKeyFile /etc/ssl/private/server.key
          ----
          

      Actualiza la configuración SSL de Apache para que requiera la autenticación con certificado de cliente y especifica el certificado de la AC para la validación.

          sudo vi /etc/apache2/sites-available/default-ssl.conf
      
          ----
          SSLVerifyClient require
          SSLVerifyDepth 5
          SSLCACertificateFile /etc/ssl/certs/client.cert
          ----
          
    4. Vuelve a generar el hash de los certificados de la AC.

          sudo c_rehash /etc/ssl/certs/
          
    5. Reinicia el servidor web Apache para aplicar los cambios.

          sudo systemctl restart apache2.service
          

    Siguientes pasos