Usar certificados SSL gestionados por Google

En esta página se muestra cómo puedes usar certificados SSL gestionados por Google para proteger el acceso Ingress en GKE. Aprenderás a usar el servicio de gestión de certificados automatizado de Google para simplificar el cifrado HTTPS de tus aplicaciones.

Estos certificados son certificados de validación de dominio (DV) que Google proporciona, renueva y gestiona para tus nombres de dominio. Estos certificados no demuestran tu identidad personal ni la de tu organización.

Esta página está dirigida a especialistas en redes y seguridad que planifican e implementan la seguridad de la red, así como a quienes desarrollan y mantienen políticas de seguridad. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas de usuario habituales de GKE.Google Cloud

Antes de leer esta página, asegúrate de que tienes conocimientos prácticos sobre GKE y un buen conocimiento de las redes y la seguridad de la red.

Para saber cómo crear certificados gestionados por Google con Google Cloud, consulta Certificados gestionados por Google.

Crear un Ingress con un certificado gestionado por Google

Para configurar un certificado SSL gestionado por Google y asociarlo a un Ingress, debes hacer lo siguiente:

  • Crea un objeto ManagedCertificate en el mismo espacio de nombres que el Ingress.
  • Asocia el objeto ManagedCertificate a un Ingress añadiendo la anotación networking.gke.io/managed-certificates al Ingress. Esta anotación es una lista de objetos ManagedCertificate separada por comas.

Limitaciones

Los certificados gestionados por Google son menos flexibles que los que obtienes y gestionas tú mismo. Los certificados gestionados por Google admiten hasta 100 dominios que no sean comodín. A diferencia de los certificados autogestionados, los certificados gestionados por Google no admiten dominios comodín.

Si necesitas certificados autogestionados o ya tienes certificados SSL que quieres configurar en tu Ingress, consulta Configurar HTTPS (TLS) entre el cliente y el balanceador de carga.

El número y el tipo de certificados admitidos por un Ingress se definen en los límites de los certificados SSL gestionados por Google.

No se admiten las actualizaciones de los certificados gestionados por Google. Para obtener más información, consulta Actualizar manualmente un certificado gestionado por Google.

Si el certificado se revoca directamente con la autoridad de certificación, Google no lo rota automáticamente. Debes eliminar el ManagedCertificate y crear otro.

Requisitos previos

  • Debes ser el propietario del nombre de dominio. El nombre de dominio no puede tener más de 63 caracteres. Puedes usar Google Domains u otro registrador.
  • Si usas un clúster Estándar de GKE, debes habilitar el complemento HttpLoadBalancing.
  • Tu ingressClassName debe ser "gce".
  • Debes aplicar los recursos Ingress y ManagedCertificate en el mismo proyecto y espacio de nombres.
  • Crea una dirección IP externa estática (reservada). Reservar una dirección IP estática asegura que siga siendo tuya, aunque elimines el recurso Ingress. Si no reservas una dirección IP, es posible que cambie, por lo que tendrás que volver a configurar los registros DNS de tu dominio. Usa la CLI de Google Cloud o la consola para crear una dirección IP reservada. Google Cloud

    gcloud

    Para crear una dirección IP reservada, ejecuta el siguiente comando:

    gcloud compute addresses create ADDRESS_NAME --global
    

    Sustituye ADDRESS_NAME por el nombre de la dirección IP reservada que vas a crear.

    Para encontrar la dirección IP estática que has creado, ejecuta el siguiente comando:

    gcloud compute addresses describe ADDRESS_NAME --global
    

    El resultado debería ser similar al siguiente:

    address: 203.0.113.32
    ...
    

    Consola

    Para crear una dirección IP reservada, sigue estos pasos:

    1. Ve a la página Direcciones IP externas de la Google Cloud consola.

      Ir a direcciones IP externas

    2. Especifica un nombre para la dirección IP (por ejemplo, example-ip-address).

    3. Especifica si quieres una dirección IPv4 o IPv6.

    4. En Tipo, seleccione la opción Global.

    5. Haz clic en Reservar. La dirección IP se indica en la columna Dirección externa.

    Config Connector

    Nota: Para este paso se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    kind: ComputeAddress
    metadata:
      name: example-ip-address
    spec:
      location: global
    Para implementar este manifiesto, descárgalo en tu máquina como compute-address.yaml y ejecuta el siguiente comando:

    kubectl apply -f compute-address.yaml
    

Configurar un certificado gestionado por Google

  1. Crea un objeto ManagedCertificate. Este recurso especifica los dominios del certificado SSL. No se admiten dominios comodín.

    El siguiente manifiesto describe un objeto ManagedCertificate. Guarda el manifiesto como managed-cert.yaml.

    apiVersion: networking.gke.io/v1
    kind: ManagedCertificate
    metadata:
      name: managed-cert
    spec:
      domains:
        - FQDN_1
        - FQDN_2
    

    Haz los cambios siguientes:

    • FQDN_1, FQDN_2: Nombres de dominio completos que te pertenecen. Por ejemplo, example.com y www.example.com.
  2. Aplica el manifiesto a tu clúster:

    kubectl apply -f managed-cert.yaml
    
  3. Crea un servicio de tipo NodePort para exponer tu aplicación a Internet.

    El siguiente manifiesto describe un servicio de tipo NodePort. Guarda el manifiesto como mc-service.yaml.

    apiVersion: v1
    kind: Service
    metadata:
      name: mc-service
    spec:
      selector:
        app: mc-service
      type: NodePort
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    
  4. Aplica el manifiesto a tu clúster:

    kubectl apply -f mc-service.yaml
    
  5. Crea un objeto Ingress.

    El siguiente manifiesto describe un Ingress que usa el ManagedCertificate que has creado. Guarda el manifiesto como managed-cert-ingress.yaml.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: managed-cert-ingress
      annotations:
        kubernetes.io/ingress.global-static-ip-name: ADDRESS_NAME
        networking.gke.io/managed-certificates: managed-cert
        kubernetes.io/ingress.class: "gce"  # Updated annotation
    spec:
      defaultBackend:
        service:
          name: mc-service
          port:
            number: SERVICE_PORT
    

    Haz los cambios siguientes:

    • ADDRESS_NAME: el nombre de tu dirección IP reservada.
    • SERVICE_PORT: el valor de ports.port en el archivo de manifiesto de tu servicio.
  6. Aplica el manifiesto a tu clúster:

    kubectl apply -f managed-cert-ingress.yaml
    
    .
  7. Obtén la dirección IP del balanceador de carga:

    kubectl get ingress
    

    El resultado debería ser similar al siguiente:

    NAME                 HOSTS       ADDRESS         PORTS     AGE
    managed-cert-ingress   *         203.0.113.32     80       54s
    

    La dirección IP del balanceador de carga se muestra en la columna ADDRESS. Si usas una dirección IP estática reservada, será la dirección del balanceador de carga.

    Si la dirección no aparece, espera a que Ingress termine de configurarse.

  8. Configura los registros DNS de tus dominios para que apunten a la dirección IP del balanceador de carga. Si usas Cloud DNS, consulta Gestión de registros para obtener más información.

  9. Espera a que termine el aprovisionamiento del certificado gestionado por Google. Este proceso puede tardar hasta 60 minutos. Puedes comprobar el estado del certificado con el siguiente comando:

    kubectl describe managedcertificate managed-cert
    

    El resultado debería ser similar al siguiente:

    Name:         managed-cert
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         ManagedCertificate
    (...)
    Spec:
     Domains:
       FQDN_1
       FQDN_2
    Status:
     CertificateStatus: Active
    (...)
    

    El valor del campo Status.CertificateStatus indica que el certificado se ha aprovisionado. Si Status.CertificateStatus no es Active, el certificado aún no se ha aprovisionado.

  10. Para comprobar los eventos de un Ingress, usa el siguiente comando:

    kubectl describe ingress INGRESS_NAME
    

    Sustituye INGRESS_NAME por el nombre de tu Ingress.

  11. Para verificar que SSL funciona, visita tus dominios con el prefijo https://. Tu navegador indica que la conexión es segura y puedes ver los detalles del certificado.

Migrar de certificados autogestionados a certificados gestionados por Google

Cuando migres un Ingress de certificados SSL autogestionados a certificados SSL gestionados por Google, no elimines ningún certificado SSL autogestionado antes de que los certificados SSL gestionados por Google estén activos. Una vez que se hayan aprovisionado correctamente los certificados SSL gestionados por Google, se activarán automáticamente. Cuando los certificados SSL gestionados por Google estén activos, podrás eliminar tus certificados SSL autogestionados.

Sigue estas instrucciones para migrar de certificados SSL autogestionados a certificados SSL gestionados por Google.

  1. Añade un certificado gestionado por Google al Ingress, tal como se describe en la sección Configurar un certificado gestionado por Google.
  2. Espera hasta que el estado del recurso de certificado gestionado por Google sea Activo. Comprueba el estado del certificado con el siguiente comando:

    kubectl describe managedcertificate managed-cert
    
  3. Cuando el estado sea Active, actualiza el Ingress para quitar las referencias al certificado autogestionado.

Eliminar un certificado gestionado por Google

Para quitar un certificado gestionado por Google de tu clúster, debes eliminar el objeto ManagedCertificate y quitar la anotación de entrada que lo haga referencia.

  1. Elimina el objeto ManagedCertificate:

    kubectl delete -f managed-cert.yaml
    

    El resultado debería ser similar al siguiente:

    managedcertificate.networking.gke.io "managed-cert" deleted
    
  2. Elimina la anotación de Ingress:

    kubectl annotate ingress managed-cert-ingress networking.gke.io/managed-certificates-
    

    Fíjate en el signo menos (-) que aparece al final del comando.

  3. Libera la dirección IP estática que has reservado para tu balanceador de carga.

    Puedes usar la CLI de Google Cloud, la Google Cloud consola o Config Connector para liberar una dirección IP reservada.

    gcloud

    Usa el siguiente comando para liberar la dirección IP reservada:

    gcloud compute addresses delete ADDRESS_NAME --global
    

    Sustituye ADDRESS_NAME por el nombre de la dirección IP.

    Consola

    Para liberar la dirección IP reservada, sigue estos pasos:

    1. Ve a la página Direcciones IP externas de la Google Cloud consola.

      Ir a direcciones IP externas

    2. Seleccione la casilla situada junto a la dirección IP que quiera liberar.

    3. Haz clic en Liberar dirección IP.

    Config Connector

    Nota: Para este paso se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    kind: ComputeAddress
    metadata:
      name: example-ip-address
    spec:
      location: global

    Para implementar este manifiesto, descárgalo en tu máquina como compute-address.yaml y ejecuta el siguiente comando:

    kubectl delete -f compute-address.yaml
    

Solución de problemas

En esta sección se explica cómo solucionar problemas con los certificados gestionados por Google.

Comprobar eventos en ManagedCertificate y recursos de Ingress

Si supera el número de certificados permitidos, se añade un evento con el motivo TooManyCertificates al ManagedCertificate. Puedes consultar los eventos de un objeto ManagedCertificate con el siguiente comando:

kubectl describe managedcertificate CERTIFICATE_NAME

Sustituye CERTIFICATE_NAME por el nombre de tu ManagedCertificate.

Si adjuntas un ManagedCertificate que no existe a un Ingress, se añade un evento con el motivo MissingCertificate al Ingress. Puedes consultar los eventos de un Ingress con el siguiente comando:

kubectl describe ingress INGRESS_NAME

Sustituye INGRESS_NAME por el nombre de tu Ingress.

No se aprovisiona el certificado gestionado cuando el dominio se resuelve en direcciones IP de varios balanceadores de carga

Si tu dominio se resuelve en direcciones IP de varios balanceadores de carga (varios objetos Ingress), debes crear un solo objeto ManagedCertificate y adjuntarlo a todos los objetos Ingress. Si creas muchos objetos ManagedCertificate y los asocias a un objeto Ingress independiente, es posible que la autoridad de certificación no pueda verificar la propiedad de tu dominio y que no se aprovisionen algunos de tus certificados. Para que la verificación se realice correctamente, el certificado debe estar visible en todas las direcciones IP a las que se resuelva tu dominio.

En concreto, cuando tu dominio se resuelva en direcciones IPv4 e IPv6 que estén configuradas con objetos Ingress diferentes, debes crear un solo objeto ManagedCertificate y adjuntarlo a ambos Ingresses.

Se ha interrumpido la comunicación entre los certificados gestionados por Google y el recurso Ingress

Los certificados gestionados se comunican con Ingress mediante la anotación ingress.gcp.kubernetes.io/pre-shared-cert. Puedes interrumpir esta comunicación si, por ejemplo:

  • Ejecuta un proceso automatizado que borre la ingress.gcp.kubernetes.io/pre-shared-cert anotación.
  • Almacena una captura de Ingress, elimínala y restáurala a partir de la captura. Mientras tanto, es posible que se haya eliminado un recurso SslCertificate que figura en la anotación ingress.gcp.kubernetes.io/pre-shared-cert. Ingress no funciona si falta algún certificado asociado.

Si se interrumpe la comunicación entre los certificados gestionados por Google y el Ingress, elimina el contenido de la anotación ingress.gcp.kubernetes.io/pre-shared-cert y espera a que el sistema se reconcilie. Para evitar que vuelva a ocurrir, asegúrate de que la anotación no se modifique ni se elimine por error.

Errores de validación al crear un certificado gestionado por Google

Las definiciones de ManagedCertificate se validan antes de que se cree el objeto ManagedCertificate. Si no se puede realizar la validación, no se crea el objeto ManagedCertificate y se muestra un mensaje de error. A continuación, se explican los diferentes mensajes de error y motivos:

spec.domains in body should have at most 100 items

Tu manifiesto ManagedCertificate incluye más de 100 dominios en el campo spec.domains. Los certificados gestionados por Google solo admiten hasta 100 dominios.

spec.domains in body should match '^(([a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9])\.)+[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]\.?$'

Has especificado un nombre de dominio no válido o un nombre de dominio comodín en el campo spec.domains. El objeto ManagedCertificate no admite dominios comodín (por ejemplo, *.example.com).

spec.domains in body should be at most 63 chars long

Has especificado un nombre de dominio demasiado largo. Los certificados gestionados por Google admiten nombres de dominio de 63 caracteres como máximo.

Actualizar manualmente un certificado gestionado por Google

Para actualizar manualmente el certificado de forma que el certificado del dominio antiguo siga funcionando hasta que se aprovisione el certificado del nuevo dominio, sigue estos pasos:

  1. Crea un ManagedCertificate para el nuevo dominio.
  2. Añade el nombre del ManagedCertificate a la anotación networking.gke.io/managed-certificates en el Ingress mediante una lista separada por comas. No elimine el nombre del certificado antiguo.
  3. Espera hasta que ManagedCertificate se active.
  4. Desasocia el certificado antiguo del Ingress y elimínalo.

Cuando creas un ManagedCertificate, Google Cloud crea un certificado SSL gestionado por Google. No puedes actualizar este certificado. Si actualizas el ManagedCertificate, Google Cloud se elimina y se vuelve a crear el certificado SSL gestionado por Google.

Para proporcionar un Ingress cifrado HTTPS seguro para tus clústeres de GKE, consulta el ejemplo Ingress seguro.

Siguientes pasos