
Nel contesto digitale di oggi, sicurezza e privacy delle comunicazioni online sono priorità assolute. I certificati SSL hanno un ruolo cruciale: instaurano connessioni sicure, proteggono i dati sensibili e rafforzano la fiducia tra utenti e siti web.
Quando si configurano i certificati SSL su Google Cloud Platform (GCP) per i load balancer, la verifica della proprietà del dominio è un passaggio decisivo. Il metodo tradizionalmente più diffuso è l'autorizzazione basata sul load balancer: prevede l'installazione di un certificato SSL gestito da Google sul load balancer e l'associazione del dominio all'IP del load balancer tramite un record A.
Configurare i certificati SSL gestiti tramite l'autorizzazione basata sul load balancer può però richiedere tempo ed esporre a errori. Innanzitutto, è necessario completare tutti i passaggi di configurazione prima di poter emettere il certificato TLS (SSL): un errore o una dimenticanza si traducono in ritardi. In secondo luogo, la propagazione globale dei record DNS può richiedere fino a 48 ore, con una finestra tipica di 10–15 minuti in cui il dominio del certificato SSL risulta irraggiungibile. Per questo motivo, l'approccio è indicato soprattutto per la configurazione di nuovi ambienti privi di traffico di produzione.
Per superare questi limiti e avere i certificati gestiti da Google pronti prima di attivare il load balancer o di migrare a Google Cloud da un altro vendor, la Domain authorization rappresenta una valida alternativa. Si basa sulla configurazione di record DNS dedicati aggiuntivi per verificare la proprietà del dominio: in questo modo è possibile emettere i certificati in anticipo, anche prima che il proxy di destinazione sia pronto a gestire il traffico di rete. Il risultato sono migrazioni a zero downtime da soluzioni di terze parti a Google Cloud, con una transizione decisamente più fluida.
Nella tabella seguente sono riportate le differenze tra Load balancer authorization e Domain authorization.

In questo articolo vediamo come configurare la domain authorization e creare nuovi certificati nel certificate manager sfruttando la domain authorization.
Prerequisiti
- Una zona DNS pubblica in Cloud DNS
La domain authorization è compatibile anche con altri provider DNS e con .
- API del certificate manager abilitata nel progetto GCP.
- gcloud CLI.
Per questo articolo utilizzo la zona pubblica chimbuc.dns.doit-playground.com in Cloud DNS.

Configurare la DNS authorization
- Impostare le variabili di ambiente necessarie.
export PROJECT_ID="your-project-id"export REGION="your-region" # ex: us-central1export DOMAIN_NAME="domain-name-for-the-certificate" # ex: example.chimbuc.dns.doit-playground.comexport DOMAIN_AUTHORIZATION_NAME="dns-authorization-resource-name" # ex: dns-authorization-exampleexport 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-comexport CERTIFICATE_MAP_NAME="certificate-map-name" # ex: example-dns-authorization-cert-mapexport CERTIFICATE_MAP_ENTRY_NAME="certificate-map-entry" # ex: example-dns-authorization-cert-map-entry- Creare una DNS authorization per il proprio dominio. Poiché ogni DNS authorization copre un solo hostname, occorre crearne una per ciascun hostname che si intende usare con il certificato di destinazione.
Se la DNS authorization è destinata a un certificato wildcard, ad esempio *.example.com , configurarla sul dominio principale (in questo caso example.com ).
gcloud certificate-manager dns-authorizations create $DOMAIN_AUTHORIZATION_NAME \ --domain="${DOMAIN_NAME}" \ --project $PROJECT_ID
DNS authorization per example.chimbuc.dns.doit-playground.com
- Recuperare i dettagli del record CNAME da aggiungere alla configurazione DNS.
gcloud certificate-manager dns-authorizations describe $DOMAIN_AUTHORIZATION_NAME \ --project $PROJECT_ID
Dettagli della DNS authorization per example.chimbuc.dns.doit-playground.com
- Aggiungere il record CNAME alla configurazione DNS. Se per la gestione del DNS si utilizza Google Cloud, seguire i passaggi indicati di seguito; in caso contrario, fare riferimento alla documentazione della soluzione DNS di terze parti.
#Initiate the DNS record transactiongcloud dns record-sets transaction start --zone="${CLOUD_DNS_ZONE_NAME}" \ --project $PROJECT_ID
#Add the CNAME record to the target DNS zonegcloud 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 changesgcloud dns record-sets transaction execute --zone="${CLOUD_DNS_ZONE_NAME}" \ --project $PROJECT_ID
Configurazione DNS
Creare un certificato gestito da Google con DNS authorization
- Creare il certificato per il dominio configurato con la DNS authorization. I certificati gestiti da Google si possono creare solo nella location globale.
gcloud certificate-manager certificates create $CERTIFICATE_NAME \ --domains="${DOMAIN_NAME}" \ --dns-authorizations="${DOMAIN_AUTHORIZATION_NAME}" \ --project $PROJECT_ID

L'emissione del certificato richiede qualche minuto. Al termine, lo stato passa ad active. Se rimane in stato Pending a lungo, fare clic sul nome del certificato per consultare le cause dell'errore.
- Verificare lo stato del certificato.
gcloud certificate-manager certificates describe $CERTIFICATE_NAME --project $PROJECT_ID

Per distribuire il certificato su un load balancer occorre creare una certificate map che faccia riferimento a una o più certificate map entry, le quali associano certificati specifici a hostname specifici. Per maggiori dettagli si rimanda a How Certificate Manager Works.
- Creare una certificate map.
gcloud certificate-manager maps create $CERTIFICATE_MAP_NAME --project $PROJECT_ID
Certificate Map
- Creare una certificate map entry per il dominio.
gcloud certificate-manager maps entries create $CERTIFICATE_MAP_ENTRY_NAME \ --map="${CERTIFICATE_MAP_NAME}" \ --certificates="${CERTIFICATE_NAME}" \ --hostname="${DOMAIN_NAME}" \ --project $PROJECT_ID
Certificate Map entry
Attendere qualche minuto perché la certificate map entry venga creata e lo stato passi ad active.
gcloud certificate-manager maps entries describe $CERTIFICATE_MAP_ENTRY_NAME \ --map="${CERTIFICATE_MAP_NAME}" \ --project $PROJECT_ID
Distribuire un'applicazione di esempio
- Creare un managed instance group e installare 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- Creare una regola firewall per consentire il traffico dai sistemi di health check di 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
istanza di esempio
Distribuire il certificato su un load balancer
- Creare le risorse del load balancer.
#Reserve an external ipgcloud compute addresses create external-lb-ipv4 \ --ip-version=IPV4 \ --network-tier=PREMIUM \ --global \ --project $PROJECT_ID
#Create a health checkgcloud compute health-checks create http http-basic-check \ --port 80 \ --project $PROJECT_ID
#Create a backend servicegcloud 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 servicegcloud compute url-maps create web-app-url-map-https \ --default-service web-app-backend-service \ --project $PROJECT_ID- Creare un target HTTPS proxy per instradare le richieste verso la URL map e collegare la 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
Il certificato è collegato al target HTTPS proxy
- Creare una global forwarding rule per instradare le richieste in entrata al 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
Configurazione del LB esterno
- Creare un record set in Cloud DNS per il dominio e accedere all'endpoint.

Record A per example.chimbuc.dns.doit-playground.com

In sintesi, ricorrere alla domain authorization su Google Cloud Platform (GCP) accelera in modo significativo l'emissione dei certificati SSL rispetto al metodo tradizionale basato sul load balancer. Seguendo i passaggi descritti in questo articolo, potrà configurare la domain authorization in modo efficiente, creare nuovi certificati TLS e rafforzare la sicurezza del proprio ambiente GCP, riducendo al minimo il downtime e ottenendo una transizione più fluida.