No cenário digital atual, garantir a segurança e a privacidade das comunicações online é essencial. Os certificados SSL têm papel fundamental para estabelecer conexões seguras, proteger dados sensíveis e gerar confiança entre usuários e sites.
Ao configurar certificados SSL no Google Cloud Platform (GCP) para load balancers, a verificação de propriedade do domínio é um fator-chave. Tradicionalmente, a autorização baseada em load balancer é o método preferido. Ela consiste em vincular um certificado SSL gerenciado pelo Google a um load balancer e associar o domínio ao IP do load balancer por meio de um registro A.
Configurar certificados SSL gerenciados pela autorização baseada em load balancer pode ser demorado e suscetível a erros. Primeiro, é preciso concluir todas as etapas de configuração antes de provisionar o certificado TLS (SSL). Qualquer erro ou etapa esquecida gera atrasos. Segundo, a propagação global de registros DNS pode levar até 48 horas. Ou seja, há uma janela típica de 10 a 15 minutos em que o domínio do certificado SSL fica inacessível. Por isso, essa abordagem se encaixa melhor na configuração de novos ambientes, sem tráfego de produção.
Para contornar esses desafios e garantir que os certificados gerenciados pelo Google estejam prontos antes do load balancer ou da migração de outro fornecedor para o Google Cloud, o Domain authorization é uma alternativa. Com o Domain authorization, você configura registros DNS dedicados adicionais para verificar a propriedade do domínio. Isso permite provisionar os certificados com antecedência, mesmo antes de o proxy de destino estar pronto para lidar com tráfego de rede. O resultado: migrações sem downtime de soluções de terceiros para o Google Cloud passam a ser viáveis, com uma transição muito mais tranquila.
Veja na tabela abaixo as diferenças entre Load balancer authorization e Domain authorization.

Neste artigo, você vai ver como configurar o domain authorization e criar novos certificados no certificate manager usando esse recurso.
**Pré-requisitos**
- Uma zona DNS pública no Cloud DNS
O Domain authorization também funciona com outros provedores de DNS.
- API do certificate manager habilitada no projeto do GCP.
- gcloud CLI.
Neste artigo, vou usar a zona pública chimbuc.dns.doit-playground.com no Cloud DNS.

**Configurando o DNS authorization**
- Defina as variáveis de ambiente necessárias.
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
- Crie um DNS authorization para o seu domínio. Como cada DNS authorization cobre apenas um hostname, é preciso criar um para cada hostname que você queira usar com o certificado de destino.
Se estiver criando um DNS authorization para um certificado wildcard, como
*.example.com, configure o DNS authorization no domínio pai (por exemplo,example.com).
gcloud certificate-manager dns-authorizations create $DOMAIN_AUTHORIZATION_NAME \
--domain="${DOMAIN_NAME}" \
--project $PROJECT_ID

DNS authorization para example.chimbuc.dns.doit-playground.com
- Pegue os detalhes do registro CNAME que você precisa adicionar à configuração do seu DNS.
gcloud certificate-manager dns-authorizations describe $DOMAIN_AUTHORIZATION_NAME \
--project $PROJECT_ID

Detalhes do DNS authorization para example.chimbuc.dns.doit-playground.com
- Adicione o registro CNAME à configuração do seu DNS. Se você usa o Google Cloud para gerenciar o DNS, siga os passos desta seção. Caso contrário, consulte a documentação do seu provedor de DNS.
#Inicia a transação do registro DNS
gcloud dns record-sets transaction start --zone="${CLOUD_DNS_ZONE_NAME}" \
--project $PROJECT_ID
#Adiciona o registro CNAME à zona DNS de destino
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
#Executa a transação do registro DNS para salvar as alterações
gcloud dns record-sets transaction execute --zone="${CLOUD_DNS_ZONE_NAME}" \
--project $PROJECT_ID

Configuração de DNS
Crie um certificado gerenciado pelo Google com DNS authorization
- Crie o certificado para o domínio configurado com DNS authorization. Só dá para criar certificados gerenciados pelo Google na localização
global.
gcloud certificate-manager certificates create $CERTIFICATE_NAME \
--domains="${DOMAIN_NAME}" \
--dns-authorizations="${DOMAIN_AUTHORIZATION_NAME}" \
--project $PROJECT_ID


Aguarde alguns minutos até o certificado ser provisionado. Quando terminar, o status muda para active. Se ficar em Pending por muito tempo, clique no nome do certificado para ver os motivos da falha.
- Verifique o status do certificado.
gcloud certificate-manager certificates describe $CERTIFICATE_NAME --project $PROJECT_ID


Para implantar o certificado gerado em um load balancer, é preciso criar um certificate map que referencie uma ou mais certificate map entries, atribuindo certificados específicos a hostnames específicos. Veja mais detalhes em How Certificate Manager Works.
- Crie um certificate map.
gcloud certificate-manager maps create $CERTIFICATE_MAP_NAME --project $PROJECT_ID

Certificate Map
- Crie uma entrada no certificate map para o domínio.
gcloud certificate-manager maps entries create $CERTIFICATE_MAP_ENTRY_NAME \
--map="${CERTIFICATE_MAP_NAME}" \
--certificates="${CERTIFICATE_NAME}" \
--hostname="${DOMAIN_NAME}" \
--project $PROJECT_ID

Entrada do Certificate Map
Aguarde alguns minutos até a entrada do certificate map ser provisionada e o status mudar para active.
gcloud certificate-manager maps entries describe $CERTIFICATE_MAP_ENTRY_NAME \
--map="${CERTIFICATE_MAP_NAME}" \
--project $PROJECT_ID

Implantando uma aplicação de exemplo
- Crie um managed instance group e instale o Apache.
#Cria um 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'
#Cria o managed instance group a partir do template.
gcloud compute instance-groups managed create web-app-instance-group \
--template=web-app-instance-template \
--size=1 \
--zone="${REGION}"-b \
--project $PROJECT_ID
#Adiciona uma named port ao instance group
gcloud compute instance-groups set-named-ports web-app-instance-group \
--named-ports http:80 \
--zone "${REGION}"-b \
--project $PROJECT_ID
- Crie uma regra de firewall para permitir o tráfego dos sistemas de health check do 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

instância de exemplo
Implantando o certificado em um load balancer
- Crie os recursos do load balancer.
#Reserva um IP externo
gcloud compute addresses create external-lb-ipv4 \
--ip-version=IPV4 \
--network-tier=PREMIUM \
--global \
--project $PROJECT_ID
#Cria um health check
gcloud compute health-checks create http http-basic-check \
--port 80 \
--project $PROJECT_ID
#Cria um 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
#Adiciona o instance group como backend ao 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
#Cria um URL map para encaminhar as requisições recebidas para o backend service padrão
gcloud compute url-maps create web-app-url-map-https \
--default-service web-app-backend-service \
--project $PROJECT_ID
- Crie um target HTTPS proxy para encaminhar as requisições ao URL map e anexe o certificate map ao 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

Certificado anexado ao target HTTPS proxy
- Crie uma global forwarding rule para encaminhar as requisições recebidas ao 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

Configuração do LB externo
- Crie um record set no Cloud DNS para o domínio e acesse o endpoint.

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

**Conclusão**
Em resumo, o domain authorization no Google Cloud Platform (GCP) acelera bastante o provisionamento de certificados SSL em comparação ao método tradicional baseado em load balancer. Seguindo os passos detalhados neste post, você configura o domain authorization de forma eficiente, cria novos certificados TLS e reforça a segurança do seu ambiente no GCP. Essa abordagem reduz o downtime e garante uma transição mais tranquila.