Implante um certificado global gerenciado pelo Google com autorização de DNS


Neste tutorial, explicamos o processo de implantação do certificado usando um certificado gerenciado pelo Google com a autorização de DNS como exemplo.

Os seguintes balanceadores de carga dão suporte a certificados gerenciados pelo Google com autorização de DNS:

  • Balanceador de carga de aplicativo externo global
  • Balanceador de carga de aplicativo clássico
  • Balanceador de carga de aplicativo interno entre regiões
  • Balanceador de carga de rede de proxy externo global

Para uma comparação dos tipos compatíveis de autorização de domínio, consulte Autorizações de domínio.

Se você quiser migrar um certificado atual para o Gerenciador de certificados, siga as etapas em Migrar certificados para o gerenciador de certificados.

Objetivos

Nesta seção, mostramos como concluir as seguintes tarefas:

  • Crie um certificado gerenciado pelo Google emitido por uma autoridade de certificação confiável publicamente com autorização DNS usando o Gerenciador de certificados.
  • Implante o certificado em um balanceador de carga compatível usando um proxy HTTPS de destino.

Para mais informações sobre o processo de implantação de certificados, consulte a Visão geral da implantação.

Antes de começar

  1. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  2. A versão 465.0.0 ou mais recente da CLI gcloud é necessária para implantar o certificado. Para verificar a versão da CLI gcloud, execute o seguinte comando:

    gcloud --version
    
  3. Para atualizar a CLI gcloud, execute o comando a seguir.

    gcloud components update
    
  4. Verifique se você tem os papéis a seguir para concluir as tarefas deste tutorial:

    • Proprietário do gerenciador de certificados: necessário para criar e gerenciar recursos do gerenciador de certificados.
    • Administrador do balanceador de carga do Compute ou Administrador de rede do Compute:necessário para criar e gerenciar o proxy de destino HTTPS.
    • Administrador de DNS: obrigatório se você quiser usar o Cloud DNS como sua solução de DNS.

    Para ver mais informações, consulte os seguintes tópicos:

Criar um certificado gerenciado pelo Google com autorização de DNS

Conclua as etapas nesta seção para criar uma autorização de DNS e um certificado gerenciado pelo Google que faça referência a essa autorização.

Criar uma autorização de DNS

Crie a autorização de DNS conforme descrito nesta seção. Se você estiver criando uma autorização de DNS para um certificado de caractere curinga, como *.myorg.example.com, configure a autorização de DNS para o domínio pai, por exemplo, myorg.example.com.

gcloud

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

Para usar a autorização de DNS por projeto (Prévia), execute o seguinte comando:

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

Substitua:

  • AUTHORIZATION_NAME: o nome da autorização de DNS.
  • DOMAIN_NAME: o nome do domínio para o qual você está criando essa autorização de DNS. O nome de domínio precisa ser totalmente qualificado, como myorg.example.com.

O comando vai retornar uma saída semelhante à seguinte. Use o registro CNAME da saída para adicionar à configuração 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 criar uma autorização de DNS, use um 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
  }
}

Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.

Adicionar o registro CNAME à configuração de DNS

Se você estiver usando o Google Cloud para gerenciar seu DNS, conclua as etapas desta seção. Caso contrário, consulte a documentação da sua solução de DNS de terceiros.

Antes de concluir as etapas nesta seção, verifique se você criou uma zona DNS pública.

Quando você cria uma autorização de DNS, o comando da CLI gcloud retorna o registro CNAME correspondente. Você precisa adicionar esse registro CNAME à sua configuração DNS na zona DNS do domínio de destino da seguinte maneira:

gcloud

  1. Inicie a transação do registro DNS:
  gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"

Substitua DNS_ZONE_NAME pelo nome da zona DNS de destino.

  1. Adicione o registro CNAME à zona DNS de destino:
  gcloud dns record-sets transaction add CNAME_RECORD \
      --name="_acme-challenge.DOMAIN_NAME." \
      --ttl="30" \
      --type="CNAME" \
      --zone="DNS_ZONE_NAME"

Substitua:

  • CNAME_RECORD: o valor de dados completo do registro CNAME retornado pelo comando da Google Cloud CLI que criou a autorização de DNS correspondente.
  • DOMAIN_NAME: o nome do domínio de destino. O nome de domínio precisa ser um nome de domínio totalmente qualificado, como myorg.example.com. Inclua também o ponto final após o nome do domínio de destino.
  • DNS_ZONE_NAME: o nome da zona de DNS de destino.

Veja o exemplo a seguir:

  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. Execute a transação do registro DNS para salvar suas alterações:
  gcloud dns record-sets transaction execute --zone="DNS_ZONE_NAME"
  

Substitua DNS_ZONE_NAME pelo nome da zona DNS de destino.

Terraform

Para adicionar o registro CNAME à configuração de DNS, use um 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]
}

Criar um certificado gerenciado pelo Google que faça referência à autorização DNS

Para criar um certificado gerenciado pelo Google que faça referência à autorização de DNS criada nas etapas anteriores, faça o seguinte:

gcloud

Para um balanceador de carga de aplicativo externo global, um balanceador de carga de aplicativo clássico ou um balanceador de carga de rede de proxy externo global:

Execute este comando:

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

Substitua:

  • CERTIFICATE_NAME: um nome exclusivo do certificado.
  • DOMAIN_NAME: o domínio de destino do certificado. O nome de domínio precisa ser um nome de domínio totalmente qualificado, como myorg.example.com.
  • AUTHORIZATION_NAME: o nome da autorização de DNS que você criou para o certificado.

Para criar um certificado gerenciado pelo Google com um nome de domínio curinga, use o comando a seguir. Um certificado de nome de domínio curinga abrange todos os subdomínios de primeiro nível de um determinado domínio.

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

Substitua:

  • CERTIFICATE_NAME: um nome exclusivo do certificado.
  • DOMAIN_NAME: o domínio de destino do certificado. O prefixo de ponto asterisco (*.) significa um certificado de caractere curinga. O nome de domínio precisa ser totalmente qualificado, como myorg.example.com.
  • AUTHORIZATION_NAME: o nome da autorização de DNS que você criou para o certificado.

Para um balanceador de carga de aplicativo interno entre regiões:

Execute este comando:

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

Substitua:

  • CERTIFICATE_NAME: um nome exclusivo do certificado.
  • DOMAIN_NAME: o domínio de destino do certificado. O nome de domínio precisa ser um nome de domínio totalmente qualificado, como myorg.example.com.
  • AUTHORIZATION_NAME: o nome da autorização de DNS que você criou para o certificado.

Para criar um certificado gerenciado pelo Google com um nome de domínio curinga, use o comando a seguir. Um certificado de nome de domínio curinga abrange todos os subdomínios de primeiro nível de um determinado domínio.

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

Substitua:

  • CERTIFICATE_NAME: um nome exclusivo do certificado.
  • DOMAIN_NAME: o domínio de destino do certificado. O prefixo de ponto asterisco (*.) significa um certificado de caractere curinga. O nome de domínio precisa ser um nome de domínio totalmente qualificado, como myorg.example.com.
  • AUTHORIZATION_NAME: o nome da autorização de DNS que você criou para o certificado.

Terraform

Use um 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
  }
}

Verificar se o certificado está ativo

Use o comando a seguir para verificar se o próprio certificado está ativo antes de implantá-lo no balanceador de carga. Pode levar até várias horas para o estado do certificado mudar para ACTIVE.

gcloud certificate-manager certificates describe CERTIFICATE_NAME

Substitua CERTIFICATE_NAME pelo nome do certificado de destino gerenciado pelo Google.

O comando retorna uma saída semelhante a esta:

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'

Implantar o certificado em um balanceador de carga

Nesta seção, apresentamos as etapas necessárias para implantar o certificado gerenciado pelo Google em um balanceador de carga.

Antes de prosseguir com as tarefas nesta seção, verifique se você concluiu as tarefas listadas na seção Criar um certificado gerenciado pelo Google com autorização de DNS.

Dependendo do tipo do balanceador de carga, é possível implantar certificados da seguinte maneira:

Implantar o certificado usando um mapa de certificado

Nesta seção, descrevemos as etapas para implantar um certificado usando um mapa de certificado.

Criar um CertificateMap

Crie um mapa de certificado que faça referência à entrada do mapa de certificado associada ao seu certificado:

gcloud

gcloud certificate-manager maps create CERTIFICATE_MAP_NAME

Substitua CERTIFICATE_MAP_NAME pelo nome do mapa de certificado de destino.

Terraform

Para criar um mapa de certificado, use um 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
  }
}

Criar uma entrada de mapa de certificado

Crie uma entrada de mapa de certificado e a associe ao seu certificado e ao seu mapa de certificados:

gcloud

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

Substitua:

  • CERTIFICATE_MAP_ENTRY_NAME: um nome exclusivo da entrada do mapa de certificado
  • CERTIFICATE_MAP_NAME: o nome do mapa do certificado ao qual esta entrada de mapa do certificado se anexa.
  • CERTIFICATE_NAME: o nome do certificado que você quer associar a esta entrada de mapa de certificado.
  • HOSTNAME: o nome do host que você quer associar a essa entrada de mapa de certificado.

Terraform

Para criar uma entrada do mapa de certificado, use um 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
}

Verificar se a entrada do mapa de certificado está ativa

Use o comando a seguir para verificar se a entrada do mapa de certificados está ativa antes de anexar o mapa de certificado correspondente ao proxy de destino:

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

Substitua:

  • CERTIFICATE_MAP_ENTRY_NAME: o nome da entrada do mapa do certificado de destino
  • CERTIFICATE_MAP_NAME: o nome do mapa do certificado ao qual esta entrada de mapa do certificado se anexa.

O comando retorna uma saída semelhante a esta:

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'

Anexar o mapa de certificado ao proxy de destino

Anexe o mapa de certificados configurado ao proxy de destino:

gcloud

  1. No Console do Google Cloud, acesse a página Proxies de destino.

    Acessar proxies de destino

  2. Anote o nome do proxy de destino.

  3. Anexe o mapa de certificado ao proxy de destino:

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

Substitua:

  • PROXY_NAME: o nome do proxy de destino.
  • CERTIFICATE_MAP_NAME: o nome do mapa de certificado que faz referência à sua entrada de mapa de certificado e ao certificado associado.

Terraform

Para anexar o mapa de certificado ao proxy de destino, use um recurso google_compute_target_https_proxy.

Se houver certificados TLS (SSL) anexados diretamente ao proxy, o proxy vai dar preferência aos certificados referenciados pelo mapa de certificados em relação aos certificados TLS (SSL) anexados diretamente.

Anexar o certificado diretamente ao proxy de destino

Para anexar o certificado diretamente ao proxy, execute o seguinte comando:

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

Substitua:

  • PROXY_NAME: um nome exclusivo do proxy.
  • URL_MAP: o nome do mapa de URL. Você criou o mapa de URL quando criou o balanceador de carga.
  • CERTIFICATE_NAME: o nome do certificado.

Limpar

Para reverter as alterações feitas neste tutorial, siga estas etapas:

  1. Desanexe o mapa de certificado do proxy.

    Antes de remover o mapa de certificados, observe o seguinte:

    • Se houver algum certificado TLS (SSL) anexado diretamente ao proxy, a remoção do mapa de certificados fará com que o proxy retome o uso dos certificados TLS (SSL) anexados diretamente.
    • Se não houver certificados TLS (SSL) anexados diretamente ao proxy, o mapa de certificado não poderá ser removido do proxy. Primeiro, é necessário anexar pelo menos um certificado TLS (SSL) diretamente ao proxy antes de separar o mapa de certificado.

    Para desanexar o mapa de certificado, execute o seguinte comando:

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

    Substitua PROXY_NAME pelo nome do proxy de destino.

  2. Exclua a entrada do mapa de certificado:

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

    Substitua:

    • CERTIFICATE_MAP_ENTRY_NAME: o nome da entrada do mapa do certificado de destino.
    • CERTIFICATE_MAP_NAME: o nome do mapa de certificado de destino.
  3. Exclua o mapa de certificado:

    gcloud certificate-manager maps delete CERTIFICATE_MAP_NAME
    

    Substitua CERTIFICATE_MAP_NAME pelo nome do mapa de certificado de destino.

  4. Exclua o certificado gerenciado pelo Google:

    gcloud certificate-manager certificates delete CERTIFICATE_NAME
    

    Substitua CERTIFICATE_NAME pelo nome do certificado de destino.

  5. Exclua a autorização de DNS:

    gcloud certificate-manager dns-authorizations delete AUTHORIZATION_NAME
    

    Substitua AUTHORIZATION_NAME pelo nome da autorização de DNS de destino.

A seguir