En el panorama digital actual, garantizar la seguridad y la privacidad de las comunicaciones en línea es fundamental. Los certificados SSL cumplen un papel clave a la hora de establecer conexiones seguras, proteger datos sensibles y generar confianza entre los usuarios y los sitios web.
Al configurar certificados SSL en Google Cloud Platform (GCP) para load balancers, verificar la propiedad del dominio es un factor decisivo. Tradicionalmente, la autorización basada en load balancer ha sido el método preferido. Consiste en montar un certificado SSL gestionado por Google en un load balancer y asociar el dominio a la IP del load balancer mediante un registro A.
Configurar certificados SSL gestionados a través de la autorización basada en load balancer puede ser lento y propenso a errores. En primer lugar, hay que completar todos los pasos de configuración antes de provisionar el certificado TLS (SSL). Esto puede ocasionar retrasos si se cometen errores o se omite algún paso. En segundo lugar, la propagación global de los registros DNS puede tardar hasta 48 horas. Es decir, suele haber una ventana de 10 a 15 minutos en la que el dominio del certificado SSL queda inaccesible. Por eso, este enfoque resulta más adecuado para configurar entornos nuevos sin tráfico productivo.
Para superar estos retos y asegurar que los certificados gestionados por Google estén listos antes que el load balancer o frente a una migración a Google Cloud desde otro proveedor, Domain authorization ofrece una solución alternativa. Con Domain authorization se configuran registros DNS dedicados adicionales para verificar la propiedad del dominio. Así se pueden provisionar certificados con anticipación, incluso antes de que el target proxy esté listo para gestionar el tráfico de red. De esta manera, se vuelven viables las migraciones sin downtime desde soluciones de terceros hacia Google Cloud, con una transición mucho más fluida.
Consulta la siguiente tabla para ver las diferencias entre Load balancer authorization y Domain authorization.

En este artículo te mostramos cómo configurar Domain authorization y crear nuevos certificados en el certificate manager usando este método.
**Requisitos previos**
- Una zona DNS pública en Cloud DNS
Domain authorization también funciona con otros proveedores de DNS.
- API de Certificate Manager habilitada en el proyecto de GCP.
- gcloud CLI.
Para este artículo, uso la zona pública chimbuc.dns.doit-playground.com en Cloud DNS.

**Configurar la autorización de DNS**
- Define las variables de entorno necesarias.
export PROJECT_ID="your-project-id"
export REGION="your-region" # ex: us-central1
export DOMAIN_NAME="domain-name-for-the-certificate" # ex: example.chimbuc.dns.doit-playground.com
export DOMAIN_AUTHORIZATION_NAME="dns-authorization-resource-name" # ex: dns-authorization-example
export CLOUD_DNS_ZONE_NAME="your-cloud-dns-zone" # ex: chimbuc.dns.doit-playground.com.
export CERTIFICATE_NAME="certificate-manager-cert-name" # ex: example-chimbuc-dns-doit-playground-com
export CERTIFICATE_MAP_NAME="certificate-map-name" # ex: example-dns-authorization-cert-map
export CERTIFICATE_MAP_ENTRY_NAME="certificate-map-entry" # ex: example-dns-authorization-cert-map-entry
- Crea una autorización de DNS para tu dominio. Como cada autorización de DNS cubre un único hostname, debes crear una por cada hostname que quieras usar con el certificado de destino.
Si vas a crear una autorización de DNS para un certificado wildcard, como
*.example.com, configúrala para el dominio padre (por ejemplo,example.com).
gcloud certificate-manager dns-authorizations create $DOMAIN_AUTHORIZATION_NAME \
--domain="${DOMAIN_NAME}" \
--project $PROJECT_ID

Autorización de DNS para example.chimbuc.dns.doit-playground.com
- Obtén los detalles del registro CNAME que debes agregar a tu configuración de DNS.
gcloud certificate-manager dns-authorizations describe $DOMAIN_AUTHORIZATION_NAME \
--project $PROJECT_ID

Detalles de la autorización de DNS para example.chimbuc.dns.doit-playground.com
- Agrega el registro CNAME a tu configuración de DNS. Si usas Google Cloud para gestionar tu DNS, sigue los pasos de esta sección. Si no, consulta la documentación de tu proveedor de DNS.
#Initiate the DNS record transaction
gcloud dns record-sets transaction start --zone="${CLOUD_DNS_ZONE_NAME}" \
--project $PROJECT_ID
#Add the CNAME record to the target DNS zone
gcloud dns record-sets transaction add CNAME_RECORD_DATA \
--name="_acme-challenge.${DOMAIN_NAME}." \
--ttl="30" \
--type="CNAME" \
--zone="${CLOUD_DNS_ZONE_NAME}" \
--project $PROJECT_ID
#Execute the DNS record transaction to save your changes
gcloud dns record-sets transaction execute --zone="${CLOUD_DNS_ZONE_NAME}" \
--project $PROJECT_ID

Configuración de DNS
Crear un certificado gestionado por Google con autorización de DNS
- Crea el certificado para el dominio que quedó configurado con autorización de DNS. Los certificados gestionados por Google solo se pueden crear en la ubicación
global.
gcloud certificate-manager certificates create $CERTIFICATE_NAME \
--domains="${DOMAIN_NAME}" \
--dns-authorizations="${DOMAIN_AUTHORIZATION_NAME}" \
--project $PROJECT_ID


Espera unos minutos a que se provisione el certificado. Cuando termine, el estado pasará a active. Si se queda en Pending por mucho tiempo, haz clic en el nombre del certificado para ver los motivos del fallo.
- Verifica el estado del certificado.
gcloud certificate-manager certificates describe $CERTIFICATE_NAME --project $PROJECT_ID


Para desplegar el certificado en un load balancer, hay que crear un certificate map que haga referencia a una o más certificate map entries, las cuales asignan certificados específicos a hostnames específicos. Para más detalles, consulta How Certificate Manager Works.
- Crea un certificate map.
gcloud certificate-manager maps create $CERTIFICATE_MAP_NAME --project $PROJECT_ID

Certificate Map
- Crea una entrada de certificate map para el dominio.
gcloud certificate-manager maps entries create $CERTIFICATE_MAP_ENTRY_NAME \
--map="${CERTIFICATE_MAP_NAME}" \
--certificates="${CERTIFICATE_NAME}" \
--hostname="${DOMAIN_NAME}" \
--project $PROJECT_ID

Entrada de Certificate Map
Espera unos minutos a que se provisione la entrada del certificate map y a que el estado cambie a active.
gcloud certificate-manager maps entries describe $CERTIFICATE_MAP_ENTRY_NAME \
--map="${CERTIFICATE_MAP_NAME}" \
--project $PROJECT_ID

Desplegar una aplicación de ejemplo
- Crea un managed instance group e instala Apache.
#Create an instance template.
gcloud compute instance-templates create web-app-instance-template \
--region=$REGION \
--project $PROJECT_ID \
--network=default \
--subnet=default \
--tags=allow-health-check \
--image-family=debian-10 \
--image-project=debian-cloud \
--metadata=startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -y
a2ensite default-ssl
a2enmod ssl
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://metadata.google.internal/computeMetadata/v1/instance/name)"
echo "Page served from: $vm_hostname" | \
tee /var/www/html/index.html
systemctl restart apache2'
#Create the managed instance group based on the template.
gcloud compute instance-groups managed create web-app-instance-group \
--template=web-app-instance-template \
--size=1 \
--zone="${REGION}"-b \
--project $PROJECT_ID
#Add a named port to the instance group
gcloud compute instance-groups set-named-ports web-app-instance-group \
--named-ports http:80 \
--zone "${REGION}"-b \
--project $PROJECT_ID
- Crea una regla de firewall para permitir el tráfico de los sistemas de health check de Google Cloud.
gcloud compute firewall-rules create fw-allow-health-check \
--network=default \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=allow-health-check \
--rules=tcp:80 \
--project $PROJECT_ID

Instancia de ejemplo
Desplegar el certificado en un load balancer
- Crea los recursos del load balancer.
#Reserve an external ip
gcloud compute addresses create external-lb-ipv4 \
--ip-version=IPV4 \
--network-tier=PREMIUM \
--global \
--project $PROJECT_ID
#Create a health check
gcloud compute health-checks create http http-basic-check \
--port 80 \
--project $PROJECT_ID
#Create a backend service
gcloud compute backend-services create web-app-backend-service \
--load-balancing-scheme=EXTERNAL \
--protocol=HTTP \
--port-name=http \
--health-checks=http-basic-check \
--global \
--project $PROJECT_ID
#Add the instance group as the backend to the backend service.
gcloud compute backend-services add-backend web-app-backend-service \
--instance-group=web-app-instance-group \
--instance-group-zone="${REGION}"-b \
--global \
--project $PROJECT_ID
#create a URL map to route the incoming requests to the default backend service
gcloud compute url-maps create web-app-url-map-https \
--default-service web-app-backend-service \
--project $PROJECT_ID
- Crea un target HTTPS proxy para enrutar las solicitudes al URL map y vincula el certificate map al target proxy.
gcloud compute target-https-proxies create https-lb-proxy \
--url-map=web-app-url-map-https \
--certificate-map="${CERTIFICATE_MAP_NAME}" \
--project $PROJECT_ID

El certificado queda vinculado al target HTTPS proxy
- Crea una regla de forwarding global para enrutar las solicitudes entrantes hacia el proxy.
gcloud compute forwarding-rules create web-app-https-fw-rule \
--load-balancing-scheme=EXTERNAL \
--network-tier=PREMIUM \
--address=external-lb-ipv4 \
--global \
--target-https-proxy=https-lb-proxy \
--ports=443 \
--project $PROJECT_ID

Configuración del LB externo
- Crea un record set en Cloud DNS para el dominio y accede al endpoint.

Registro A para example.chimbuc.dns.doit-playground.com

**Conclusión**
En conclusión, apoyarse en Domain authorization en Google Cloud Platform (GCP) acelera de forma significativa el provisionamiento de certificados SSL frente al método tradicional basado en load balancer. Si sigues los pasos detallados en este blog, podrás configurar Domain authorization con eficiencia, crear nuevos certificados TLS y reforzar la seguridad de tu entorno en GCP. Este enfoque reduce el downtime y permite una transición mucho más fluida.