Implementa un certificado global administrado por Google con autorización de DNS


En este instructivo, se explica el proceso de implementación de certificados mediante un certificado administrado por Google con autorización de DNS como ejemplo.

Los siguientes balanceadores de cargas admiten certificados administrados por Google con autorización de DNS:

  • Balanceador de cargas de aplicaciones externo global
  • Balanceador de cargas de aplicaciones clásico
  • Balanceador de cargas de aplicaciones interno entre regiones
  • Balanceador de cargas de red del proxy externo global

Para ver una comparación de los tipos de autorización de dominio admitidos, consulta Autorizaciones de dominio.

Si deseas migrar un certificado existente al Administrador de certificados, sigue los pasos que se indican en Cómo migrar certificados al Administrador de certificados.

Objetivos

En este instructivo, se muestra cómo completar las siguientes tareas:

  • Crea un certificado administrado por Google emitido por una autoridad certificadora de confianza pública con autorización de DNS mediante el Administrador de certificados.
  • Implementa el certificado en un balanceador de cargas compatible mediante un proxy HTTPS de destino.

Para obtener más información sobre el proceso de implementación de certificados, consulta Descripción general de la implementación.

Antes de comenzar

  1. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  2. Se requiere la versión 465.0.0 o posterior de gcloud CLI para implementar el certificado. Para verificar la versión de gcloud CLI, ejecuta el siguiente comando:

    gcloud --version
    
  3. Para actualizar gcloud CLI, ejecuta el siguiente comando.

    gcloud components update
    
  4. Asegúrate de tener los siguientes roles para completar las tareas de este instructivo:

    • Propietario del Administrador de certificados: Es necesario para crear y administrar los recursos del Administrador de certificados.
    • Administrador del balanceador de cargas de Compute o Administrador de la red de Compute: Es necesario para crear y administrar el proxy de destino HTTPS.
    • Administrador de DNS: Es obligatorio si deseas usar Cloud DNS como tu solución de DNS.

    Para obtener más información, consulta lo siguiente:

Crear un certificado administrado por Google con autorización de DNS

Completa los pasos de esta sección para crear una autorización de DNS y un certificado administrado por Google que haga referencia a esa autorización de DNS.

Crea una autorización de DNS

Crea la autorización de DNS como se describe en esta sección. Si creas una autorización de DNS para un certificado comodín, como *.myorg.example.com, configura la autorización de DNS para el dominio superior, por ejemplo, myorg.example.com.

gcloud

gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
   --domain="DOMAIN_NAME"
gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME

Para utilizar la autorización de DNS por proyecto (vista previa), ejecuta el siguiente comando:

gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
   --domain="DOMAIN_NAME" \
   --type="PER_PROJECT_RECORD"
gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME

Reemplaza lo siguiente:

  • AUTHORIZATION_NAME: Es el nombre de la autorización de DNS.
  • DOMAIN_NAME: Es el nombre del dominio para el que crearás esta autorización de DNS. El nombre de dominio debe ser un nombre de dominio completamente calificado, como myorg.example.com.

El comando muestra un resultado similar al siguiente. Usa el registro CNAME del resultado para agregarlo a tu configuración de DNS.

createTime: '2022-01-14T13:35:00.258409106Z'
dnsResourceRecord:
data: 0e40fc77-a37d-4eb8-8fe1-eea2e18d12d9.4.authorize.certificatemanager.goog.
name: _acme-challenge.myorg.example.com.
type: CNAME
domain: myorg.example.com
name: projects/myProject/locations/global/dnsAuthorizations/myAuthorization
updateTime: '2022-01-14T13:35:01.571086137Z'

Terraform

Para crear una autorización de DNS, puedes usar un recurso google_certificate_manager_dns_authorization.

resource "google_certificate_manager_dns_authorization" "default" {
  name        = "${local.name}-dnsauth-${random_id.tf_prefix.hex}"
  description = "The default dns auth"
  domain      = local.domain
  labels = {
    "terraform" : true
  }
}

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Agrega el registro CNAME a tu configuración de DNS

Si usas Google Cloud para administrar tu DNS, completa los pasos de esta sección. De lo contrario, consulta la documentación de tu solución de DNS de terceros.

Antes de completar los pasos de esta sección, asegúrate de haber creado una zona del DNS pública.

Cuando creas una autorización de DNS, el comando de gcloud CLI muestra el registro CNAME correspondiente. Debes agregar este registro CNAME a tu configuración de DNS en la zona del DNS del dominio de destino de la siguiente manera:

gcloud

  1. Inicia la transacción del registro DNS:
  gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"

Reemplaza DNS_ZONE_NAME por el nombre de la zona del DNS de destino.

  1. Agrega el registro CNAME a la zona del DNS de destino:
  gcloud dns record-sets transaction add CNAME_RECORD \
      --name="_acme-challenge.DOMAIN_NAME." \
      --ttl="30" \
      --type="CNAME" \
      --zone="DNS_ZONE_NAME"

Reemplaza lo siguiente:

  • CNAME_RECORD: Es el valor de datos completo del registro CNAME que muestra el comando de Google Cloud CLI que creó la autorización de DNS correspondiente.
  • DOMAIN_NAME: Es el nombre del dominio de destino. El nombre de dominio debe ser un nombre de dominio completamente calificado, como myorg.example.com. También debes incluir el punto final después del nombre de dominio de destino.
  • DNS_ZONE_NAME: Es el nombre de la zona del DNS de destino.

Consulta el siguiente ejemplo:

  gcloud dns record-sets transaction add 0e40fc77-a37d-4eb8-8fe1-eea2e18d12d9.4.authorize.certificatemanager.goog. \
      --name="_acme-challenge.myorg.example.com." \
      --ttl="30" \
      --type="CNAME" \
      --zone="myorg-example-com"
  
  1. Ejecuta la transacción de registro DNS para guardar los cambios:
  gcloud dns record-sets transaction execute --zone="DNS_ZONE_NAME"
  

Reemplaza DNS_ZONE_NAME por el nombre de la zona del DNS de destino.

Terraform

Para agregar el registro CNAME a tu configuración de DNS, puedes usar un recurso google_dns_record_set.

resource "google_dns_record_set" "cname" {
  name         = google_certificate_manager_dns_authorization.default.dns_resource_record[0].name
  managed_zone = google_dns_managed_zone.default.name
  type         = google_certificate_manager_dns_authorization.default.dns_resource_record[0].type
  ttl          = 300
  rrdatas      = [google_certificate_manager_dns_authorization.default.dns_resource_record[0].data]
}

Crea un certificado administrado por Google que haga referencia a la autorización de DNS

Para crear un certificado administrado por Google que haga referencia a la autorización de DNS que creaste en los pasos anteriores, haz lo siguiente:

gcloud

Para un balanceador de cargas de aplicaciones externo global, un balanceador de cargas de aplicaciones clásico o un balanceador de cargas de red del proxy externo global:

Ejecuta el siguiente comando:

gcloud certificate-manager certificates create CERTIFICATE_NAME \
   --domains=DOMAIN_NAME \
   --dns-authorizations=AUTHORIZATION_NAME

Reemplaza lo siguiente:

  • CERTIFICATE_NAME: Es un nombre único del certificado.
  • DOMAIN_NAME: Es el dominio de destino del certificado. El nombre de dominio debe ser un nombre de dominio completamente calificado, como myorg.example.com.
  • AUTHORIZATION_NAME: Es el nombre de la autorización de DNS que creaste para este certificado.

Para crear un certificado administrado por Google con un nombre de dominio comodín, usa el siguiente comando. Un certificado de nombre de dominio comodín abarca todos los subdominios de primer nivel de un dominio determinado.

gcloud certificate-manager certificates create CERTIFICATE_NAME \
   --domains="*.DOMAIN_NAME,DOMAIN_NAME" \
   --dns-authorizations=AUTHORIZATION_NAME

Reemplaza lo siguiente:

  • CERTIFICATE_NAME: Es un nombre único del certificado.
  • DOMAIN_NAME: Es el dominio de destino del certificado. El prefijo del punto de asterisco (*.) representa un certificado comodín. El nombre de dominio debe ser un nombre de dominio completamente calificado, como myorg.example.com.
  • AUTHORIZATION_NAME: Es el nombre de la autorización de DNS que creaste para este certificado.

Para un balanceador de cargas de aplicaciones interno entre regiones:

Ejecuta el siguiente comando:

gcloud certificate-manager certificates create CERTIFICATE_NAME \
    --domains=DOMAIN_NAME \
    --dns-authorizations=AUTHORIZATION_NAME \
    --scope=all-regions

Reemplaza lo siguiente:

  • CERTIFICATE_NAME: Es un nombre único del certificado.
  • DOMAIN_NAME: Es el dominio de destino del certificado. El nombre de dominio debe ser un nombre de dominio completamente calificado, como myorg.example.com.
  • AUTHORIZATION_NAME: Es el nombre de la autorización de DNS que creaste para este certificado.

Para crear un certificado administrado por Google con un nombre de dominio comodín, usa el siguiente comando. Un certificado de nombre de dominio comodín abarca todos los subdominios de primer nivel de un dominio determinado.

gcloud certificate-manager certificates create CERTIFICATE_NAME \
    --domains="*.DOMAIN_NAME,DOMAIN_NAME" \
    --dns-authorizations=AUTHORIZATION_NAME \
    --scope=all-regions

Reemplaza lo siguiente:

  • CERTIFICATE_NAME: Es un nombre único del certificado.
  • DOMAIN_NAME: Es el dominio de destino del certificado. El prefijo del punto de asterisco (*.) representa un certificado comodín. El nombre de dominio debe ser un nombre de dominio completamente calificado, como myorg.example.com.
  • AUTHORIZATION_NAME: Es el nombre de la autorización de DNS que creaste para este certificado.

Terraform

Usa un recurso google_certificate_manager_certificate.

resource "google_certificate_manager_certificate" "root_cert" {
  name        = "${local.name}-rootcert-${random_id.tf_prefix.hex}"
  description = "The wildcard cert"
  managed {
    domains = [local.domain, "*.${local.domain}"]
    dns_authorizations = [
      google_certificate_manager_dns_authorization.default.id
    ]
  }
  labels = {
    "terraform" : true
  }
}

Verifica que el certificado esté activo

Usa el siguiente comando para verificar que el certificado esté activo antes de implementarlo en tu balanceador de cargas. El estado del certificado puede tardar varias horas en cambiar a ACTIVE.

gcloud certificate-manager certificates describe CERTIFICATE_NAME

Reemplaza CERTIFICATE_NAME por el nombre del certificado administrado por Google de destino.

El comando muestra un resultado similar al siguiente:

certificatePem: myPEM
createTime: '2021-10-20T12:19:53.370778666Z'
expireTime: '2022-05-07T05:03:49Z'
managed:
  authorizationAttemptInfo:
  -   domain: myorg.example.com
    state: AUTHORIZED
  dnsAuthorizations:
  -   projects/my-project/locations/global/dnsAuthorizations/myAuth
  domains:
  -   myorg.example.com
  state: ACTIVE
name: projects/myProject/locations/global/certificates/myCert
scope: myScope
sanDnsnames:
-   myorg.example.com
updateTime: '2021-10-20T12:19:55.083385630Z'

Implementa el certificado en un balanceador de cargas

En esta sección, se explican los pasos necesarios para implementar el certificado administrado por Google en un balanceador de cargas.

Antes de continuar con las tareas de esta sección, asegúrate de haber completado las tareas enumeradas en la sección Crea un certificado administrado por Google con autorización de DNS.

Según el tipo de balanceador de cargas, puedes implementar certificados de la siguiente manera:

Implementa el certificado con un mapa de certificados

En esta sección, se describen los pasos para implementar un certificado con un mapa de certificados.

Crea un mapa de certificados

Crea un mapa de certificados que haga referencia a la entrada del mapa de certificados asociada con tu certificado:

gcloud

gcloud certificate-manager maps create CERTIFICATE_MAP_NAME

Reemplaza CERTIFICATE_MAP_NAME por el nombre del mapa de certificados de destino.

Terraform

Para crear un mapa de certificados, puedes usar un recurso google_certificate_manager_certificate_map.

resource "google_certificate_manager_certificate_map" "certificate_map" {
  name        = "${local.name}-certmap-${random_id.tf_prefix.hex}"
  description = "${local.domain} certificate map"
  labels = {
    "terraform" : true
  }
}

Crea una entrada de mapa de certificados

Crea una entrada de mapa de certificados y asóciala con tu certificado y con tu mapa de certificados:

gcloud

gcloud certificate-manager maps entries create CERTIFICATE_MAP_ENTRY_NAME \
   --map="CERTIFICATE_MAP_NAME" \
   --certificates="CERTIFICATE_NAME" \
   --hostname="HOSTNAME"

Reemplaza lo siguiente:

  • CERTIFICATE_MAP_ENTRY_NAME: Es un nombre único de la entrada del mapa de certificados.
  • CERTIFICATE_MAP_NAME: Es el nombre del mapa de certificados al que se adjunta esta entrada de este mapa de certificados.
  • CERTIFICATE_NAME: Es el nombre del certificado que deseas asociar con esta entrada de mapa de certificados.
  • HOSTNAME: Es el nombre de host que deseas asociar con esta entrada de mapa de certificados.

Terraform

Para crear una entrada de mapa de certificados, puedes usar un recurso google_certificate_manager_certificate_map_entry.

resource "google_certificate_manager_certificate_map_entry" "first_entry" {
  name        = "${local.name}-first-entry-${random_id.tf_prefix.hex}"
  description = "example certificate map entry"
  map         = google_certificate_manager_certificate_map.certificate_map.name
  labels = {
    "terraform" : true
  }
  certificates = [google_certificate_manager_certificate.root_cert.id]
  hostname     = local.domain
}

Cómo verificar que la entrada del mapa de certificados esté activa

Usa el siguiente comando para verificar que la entrada de mapa de certificados esté activa antes de adjuntar tu mapa de certificados correspondiente al proxy de destino:

gcloud certificate-manager maps entries describe CERTIFICATE_MAP_ENTRY_NAME \
    --map="CERTIFICATE_MAP_NAME"

Reemplaza lo siguiente:

  • CERTIFICATE_MAP_ENTRY_NAME: Es el nombre de la entrada del mapa de certificados de destino.
  • CERTIFICATE_MAP_NAME: Es el nombre del mapa de certificados al que se adjunta esta entrada de este mapa de certificados.

El comando muestra un resultado similar al siguiente:

createTime: '2021-09-06T10:01:56.229472109Z'
name: projects/my-project/locations/global/certificateMaps/myCertMap/certificateMapEntries/myCertMapEntry
state: ACTIVE
updateTime: '2021-09-06T10:01:58.277031787Z'

Conecta el mapa de certificados al proxy de destino

Adjunta el mapa de certificados configurado al proxy de destino:

gcloud

  1. En la consola de Google Cloud, ve a la página Proxies de destino.

    Ir a Proxies de destino

  2. Anota el nombre del proxy de destino.

  3. Adjunta el mapa de certificados al proxy de destino:

  gcloud compute target-https-proxies update PROXY_NAME \
      --certificate-map="CERTIFICATE_MAP_NAME" \
      --global
  

Reemplaza lo siguiente:

  • PROXY_NAME: Es el nombre del proxy de destino.
  • CERTIFICATE_MAP_NAME: Es el nombre del mapa de certificados que hace referencia a tu entrada de mapa de certificados y al certificado asociado.

Terraform

Para adjuntar el mapa de certificados al proxy de destino, puedes usar un recurso google_compute_target_https_proxy.

Si hay certificados TLS (SSL) existentes adjuntos directamente al proxy, este da prioridad a los certificados a los que hace referencia el mapa de certificados en lugar de los certificados TLS (SSL) conectados de forma directa.

Adjunta el certificado directamente al proxy de destino

Para adjuntar el certificado directamente al proxy, ejecuta el siguiente comando:

gcloud compute target-https-proxies update PROXY_NAME \
    --url-map=URL_MAP \
    --global \
    --certificate-manager-certificates=CERTIFICATE_NAME

Reemplaza lo siguiente:

  • PROXY_NAME: Es un nombre único del proxy.
  • URL_MAP: el nombre del mapa de URL. Creaste el mapa de URL cuando creaste el balanceador de cargas.
  • CERTIFICATE_NAME: Es el nombre del certificado.

Limpia

Para revertir los cambios que realizaste en este instructivo, completa los siguientes pasos:

  1. Desconecta el mapa de certificados del proxy.

    Antes de desvincular el mapa de certificados, ten en cuenta lo siguiente:

    • Si había certificados TLS (SSL) adjuntos directamente al proxy, la desvinculación del mapa de certificados hace que el proxy se reanude con esos certificados TLS (SSL) conectados de forma directa.
    • Si no había certificados TLS (SSL) adjuntos directamente al proxy, el mapa de certificados no se puede desconectar del proxy. Debes conectar al menos un certificado TLS (SSL) directamente al proxy antes de desvincular el mapa de certificados.

    Para desvincular el mapa de certificados, ejecuta el siguiente comando:

    gcloud compute target-https-proxies update PROXY_NAME \
       --clear-certificate-map
    

    Reemplaza PROXY_NAME por el nombre del proxy de destino.

  2. Borra la entrada del mapa de certificados del mapa de certificados:

    gcloud certificate-manager maps entries delete CERTIFICATE_MAP_ENTRY_NAME \
       --map="CERTIFICATE_MAP_NAME"
    

    Reemplaza lo siguiente:

    • CERTIFICATE_MAP_ENTRY_NAME: Es el nombre de la entrada del mapa de certificados de destino.
    • CERTIFICATE_MAP_NAME: Es el nombre del mapa de certificados de destino.
  3. Borra el mapa de certificados:

    gcloud certificate-manager maps delete CERTIFICATE_MAP_NAME
    

    Reemplaza CERTIFICATE_MAP_NAME por el nombre del mapa de certificados de destino.

  4. Borra el certificado administrado por Google:

    gcloud certificate-manager certificates delete CERTIFICATE_NAME
    

    Reemplaza CERTIFICATE_NAME por el nombre del certificado de destino.

  5. Borra la autorización de DNS:

    gcloud certificate-manager dns-authorizations delete AUTHORIZATION_NAME
    

    Reemplaza AUTHORIZATION_NAME por el nombre de la autorización de DNS de destino.

¿Qué sigue?