Nel panorama digitale di oggi, garantire sicurezza e riservatezza delle comunicazioni online è una priorità assoluta. I certificati SSL hanno un ruolo cruciale nello stabilire connessioni sicure, proteggere i dati sensibili e alimentare la fiducia tra utenti e siti web.
Quando si configurano certificati SSL su Google Cloud Platform (GCP) per i load balancer, la verifica della proprietà del dominio è un passaggio chiave. Il metodo storicamente 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 certificati SSL gestiti con questo metodo può però richiedere tempo ed esporre a errori. Innanzitutto, occorre completare tutti i passaggi di configurazione prima di poter effettuare il provisioning del certificato TLS (SSL): qualsiasi errore o passaggio dimenticato si traduce 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 durante la quale il dominio del certificato SSL risulta irraggiungibile. Per questi motivi 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 del load balancer o di una migrazione a Google Cloud da un altro provider, la Domain authorization rappresenta una soluzione alternativa. Con la Domain authorization si configurano record DNS dedicati per verificare la proprietà del dominio, consentendo il provisioning anticipato dei certificati anche prima che il target proxy sia pronto a gestire il traffico di rete. In questo modo diventano possibili migrazioni a zero downtime da soluzioni di terze parti a Google Cloud, con una transizione molto più fluida.
Per le differenze tra Load balancer authorization e Domain authorization, fare riferimento alla tabella seguente.

In questo articolo vedremo come configurare la Domain authorization e creare nuovi certificati nel certificate manager sfruttando proprio la Domain authorization.
**Prerequisiti**
- Una zona DNS pubblica in Cloud DNS
La Domain authorization funziona anche con altri provider DNS.
- API del Certificate manager abilitata nel progetto GCP.
- gcloud CLI.
In questo articolo utilizzo la zona pubblica chimbuc.dns.doit-playground.com in Cloud DNS.

**Configurare la DNS authorization**
- Impostare le variabili d'ambiente necessarie.
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
- Creare una DNS authorization per il proprio dominio. Poiché ogni DNS authorization copre un singolo hostname, occorre crearne una per ciascun hostname da utilizzare con il certificato di destinazione.
Se si crea una DNS authorization per un certificato wildcard come
*.example.com, configurarla sul dominio padre (ad esempioexample.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 si gestisce il DNS con Google Cloud, seguire i passaggi di questa sezione; altrimenti consultare la documentazione della soluzione DNS di terze parti in uso.
#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

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
global.
gcloud certificate-manager certificates create $CERTIFICATE_NAME \
--domains="${DOMAIN_NAME}" \
--dns-authorizations="${DOMAIN_AUTHORIZATION_NAME}" \
--project $PROJECT_ID


Attendere qualche minuto per il provisioning del certificato. Una volta completato, lo stato passa ad attivo. Se rimane in 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 associare il certificato generato a un load balancer occorre creare una certificate map che faccia riferimento a una o più certificate map entries, le quali assegnano specifici certificati a specifici hostname. Per maggiori dettagli si veda 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 per il provisioning della certificate map entry, finché lo stato non passa ad attivo.
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 che consenta il traffico proveniente 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 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
- Creare un target HTTPS proxy che instradi 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 Load Balancer esterno
- Creare un record set in Cloud DNS per il dominio e raggiungere l'endpoint.

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

**Conclusione**
In sintesi, la Domain authorization su Google Cloud Platform (GCP) accelera in modo significativo il provisioning dei certificati SSL rispetto al metodo tradizionale basato sul load balancer. Seguendo i passaggi illustrati in questo articolo è possibile configurare la Domain authorization in modo efficiente, creare nuovi certificati TLS e rafforzare la sicurezza del proprio ambiente GCP, riducendo al minimo i tempi di inattività e rendendo la transizione molto più fluida.