Implemente um certificado gerido pela Google em várias regiões com autorização de DNS

Este tutorial mostra como usar o Gestor de certificados para implementar um certificado global gerido pela Google com autorização de DNS num Application Load Balancer interno entre regiões.

Se quiser implementar balanceadores de carga externos globais ou balanceadores de carga regionais, consulte o seguinte:

Objetivos

Este tutorial mostra como concluir as seguintes tarefas:

  • Crie um certificado gerido pela Google emitido por uma autoridade de certificação fidedigna publicamente com autorização de DNS através do gestor de certificados.
  • Implemente o certificado num balanceador de carga suportado através de um proxy HTTPS de destino.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine, Certificate Manager APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  7. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Compute Engine, Certificate Manager APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  13. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  14. Crie uma zona DNS pública
  15. Funções necessárias

    Certifique-se de que tem as seguintes funções para concluir as tarefas neste tutorial:

    • Proprietário do Gestor de certificados (roles/certificatemanager.owner)

      Necessário para criar e gerir recursos do Gestor de certificados.

    • Administrador do balanceador de carga de computação (roles/compute.loadBalancerAdmin) ou administrador de rede de computação (roles/compute.networkAdmin)

      Obrigatório para criar e gerir o proxy de destino HTTPS.

    • Administrador de DNS (roles/dns.admin)

      Obrigatório se quiser usar o Cloud DNS como solução de DNS.

    Para mais informações, consulte o seguinte:

    Nomes de domínio

    Para criar certificados, obtenha os nomes de domínio totalmente qualificados (FQDNs) dos domínios que detém. Se não tiver um domínio, pode usar o Cloud Domains para registar um domínio.

    Crie o balanceador de carga

    Este tutorial pressupõe que já criou e configurou os back-ends, as verificações de estado, os serviços de back-end e os mapas de URL do balanceador de carga. Tome nota do nome do mapa de URLs, porque vai precisar dele mais tarde neste tutorial.

    Se não tiver criado um balanceador de carga de aplicações interno entre regiões, consulte o artigo Configure um balanceador de carga de aplicações interno entre regiões com back-ends de grupos de instâncias de VMs.

    Crie um certificado gerido pela Google com autorização de DNS

    Antes de criar o certificado, crie uma zona DNS pública. Em seguida, crie uma autorização de DNS e adicione o registo CNAME à zona de DNS de destino.

    Crie uma autorização de DNS

    Uma autorização de DNS abrange apenas um único nome de domínio. Tem de criar uma autorização de DNS separada para cada nome de domínio que quer usar com o certificado de destino.

    Se estiver a criar uma autorização de DNS para um certificado de caráter universal, como *.myorg.example.com, configure a autorização de DNS para o domínio principal, por exemplo, myorg.example.com.

    Consola

    Pode criar uma autorização de DNS ou anexar uma autorização de DNS existente quando cria um certificado. Para mais informações, consulte o artigo Crie um certificado gerido pela Google que faça referência à autorização de DNS.

    gcloud

    Pode criar dois tipos de autorizações de DNS: FIXED_RECORD ou PER_PROJECT_RECORD. Para mais informações, consulte o artigo Autorização de DNS.

    Autorização de DNS FIXED_RECORD

    Para criar uma FIXED_RECORD autorização de DNS, use o seguinte gcloud certificate-manager dns-authorizations create comando:

    gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
        --domain="DOMAIN_NAME" \
        --type=[FIXED_RECORD]
    

    Substitua o seguinte:

    • AUTHORIZATION_NAME: o nome da autorização de DNS.
    • DOMAIN_NAME: o nome do domínio de destino para o qual está a criar esta autorização de DNS. O nome do domínio tem de ser um nome do domínio totalmente qualificado, como myorg.example.com.

    Depois de criar a autorização de DNS FIXED_RECORD, valide-a com o comando gcloud certificate-manager dns-authorizations describe:

    gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME
    

    O resultado é semelhante ao seguinte. No resultado, encontre a secção dnsResourceRecord. Localize o registo CNAME e adicione os detalhes do registo (data, name e type) à sua 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'
    

    Autorização de DNS PER_PROJECT_RECORD

    Para criar uma PER_PROJECT_RECORD autorização de DNS, use o seguinte gcloud certificate-manager dns-authorizations create comando:

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

    Substitua o seguinte:

    • AUTHORIZATION_NAME: o nome da autorização de DNS.
    • DOMAIN_NAME: o nome do domínio de destino para o qual está a criar esta autorização de DNS. O nome do domínio tem de ser um nome do domínio totalmente qualificado, como myorg.example.com.

    Depois de criar a autorização de DNS PER_PROJECT_RECORD, valide-a com o comando gcloud certificate-manager dns-authorizations describe:

    gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME
    

    O resultado é semelhante ao seguinte. No resultado, encontre a secção dnsResourceRecord. Localize o registo CNAME e adicione os detalhes do registo (data, name e type) à sua 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_ujmmovf2vn55tgye.myorg.example.com
      type: CNAME
    domain: myorg.example.com
    name: projects/myProject/locations/global/dnsAuthorizations/myAuthorization
    updateTime: '2022-01-14T13:35:01.571086137Z'
    

    API

    Para criar uma autorização de DNS, faça um pedido POST ao método dnsAuthorizations.create:

    POST /v1/projects/PROJECT_ID/locations/global/dnsAuthorizations?dns_authorization_id=AUTHORIZATION_NAME"
    {
      "domain": "DOMAIN_NAME",
      "type": "PER_PROJECT_RECORD" //optional
    }
    

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto Google Cloud .
    • AUTHORIZATION_NAME: o nome da autorização de DNS.
    • DOMAIN_NAME: o nome do domínio de destino para o qual está a criar esta autorização de DNS. O nome do domínio tem de ser um nome do domínio totalmente qualificado, como myorg.example.com.

    Crie um certificado gerido pela Google que faça referência à autorização de DNS

    Para criar um certificado gerido pela Google que faça referência à autorização de DNS que criou nos passos anteriores, faça o seguinte:

    Consola

    1. Na Google Cloud consola, aceda à página Gestor de certificados.

      Aceda ao Gestor de certificados

    2. No separador Certificados, clique em Adicionar certificado.

    3. No campo Nome do certificado, introduza um nome exclusivo para o certificado.

    4. Opcional: no campo Descrição, introduza uma descrição para o certificado. A descrição permite-lhe identificar o certificado.

    5. Para Localização, selecione Global.

    6. Para Âmbito, selecione Todas as regiões.

    7. Para Tipo de certificado, selecione Criar certificado gerido pela Google.

    8. Para Tipo de autoridade de certificação, selecione Público.

    9. No campo Nomes de domínios, especifique uma lista de nomes de domínios do certificado separados por vírgulas. Cada nome do domínio tem de ser um nome do domínio totalmente qualificado, como myorg.example.com. O nome do domínio também pode ser um nome de domínio com carateres universais, como *.example.com.

    10. Para Tipo de autorização, selecione Autorização de DNS.

      A página apresenta as autorizações de DNS dos nomes de domínios. Se um nome de domínio não tiver uma autorização de DNS associada, siga estes passos para criar uma:

      1. Clique em Criar autorização de DNS em falta.
      2. No campo Nome da autorização de DNS, especifique o nome da autorização de DNS. O tipo de autorização de DNS predefinido é FIXED_RECORD. Para gerir certificados de forma independente em vários projetos, selecione a caixa de verificação Autorização por projeto.
      3. Clique em Criar autorização de DNS.
    11. No campo Etiquetas, especifique as etiquetas a associar ao certificado. Para adicionar uma etiqueta, clique em Adicionar etiqueta e especifique uma chave e um valor para a etiqueta.

    12. Clique em Criar.

      O novo certificado é apresentado na lista de certificados.

    gcloud

    Para criar um certificado gerido pela Google entre regiões com autorização de DNS, use o comando certificate-manager certificates create com as flags dns-authorizations e --scope:

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

    Substitua o seguinte:

    • CERTIFICATE_NAME: o nome do certificado.
    • DOMAIN_NAME: o nome do domínio de destino. O nome do domínio tem de ser um nome do domínio totalmente qualificado, como myorg.example.com, ou um domínio de caráter universal, como *.myorg.example.com. O prefixo de ponto asterisco (*.) significa um certificado de caráter universal.
    • AUTHORIZATION_NAMES: uma lista de nomes das autorizações de DNS delimitada por vírgulas.

    API

    Crie o certificado fazendo um pedido POST ao método certificates.create da seguinte forma:

    POST /v1/projects/PROJECT_ID/locations/global/certificates?certificate_id=CERTIFICATE_NAME
    {
     "managed": {
      "domains": ["DOMAIN_NAME"],
      "dnsAuthorizations": [
       "projects/PROJECT_ID/locations/global/dnsAuthorizations/AUTHORIZATION_NAME",
      ],
      "scope": "ALL_REGIONS"
     }
    }
    

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto Google Cloud .
    • CERTIFICATE_NAME: o nome do certificado.
    • DOMAIN_NAME: o nome do domínio de destino. O nome do domínio tem de ser um nome do domínio totalmente qualificado, como myorg.example.com, ou um domínio de caráter universal, como *.myorg.example.com. O prefixo de ponto com asterisco (*.) significa um certificado de caráter universal.
    • AUTHORIZATION_NAMES: uma lista de nomes das autorizações de DNS delimitada por vírgulas.

    Adicione o registo CNAME à configuração do DNS

    Se estiver a usar uma solução DNS de terceiros para gerir o seu DNS, consulte a respetiva documentação para adicionar o registo CNAME à configuração do DNS. Se estiver a usar o Google Cloud para gerir o seu DNS, conclua os passos nesta secção.

    Consola

    Para criar um conjunto de registos, siga estes passos:

    1. Na Google Cloud consola, aceda à página Zonas de DNS.

      Aceda às zonas do Cloud DNS

    2. Clique no nome da zona DNS onde quer adicionar o registo.

    3. Na página Detalhes da zona, clique em Adicionar padrão.

    4. Na página Create record set, no campo DNS name, introduza o subdomínio da zona DNS.

      Quando introduzir o nome do subdomínio, certifique-se de que o nome do subdomínio, incluindo o texto esbatido apresentado no campo Nome DNS, corresponde ao valor completo do campo dnsResourceRecord.name, conforme apresentado no resultado do comando gcloud certificate-manager dns-authorizations describe.

      Veja os exemplos seguintes:

      • Se o valor do campo dnsResourceRecord.name for _acme-challenge.myorg.example.com. e o texto esbatido no campo Nome de DNS for .example.com., introduza _acme-challenge.myorg.

      • Se o valor do campo dnsResourceRecord.name for _acme-challenge.myorg.example.com. e o texto esbatido no campo Nome de DNS for .myorg.example.com., introduza _acme-challenge.

      • Se o valor do campo dnsResourceRecord.name for _acme-challenge_ujmmovf2vn55tgye.myorg.example.com. e o texto esbatido no campo Nome de DNS for .myorg.example.com., introduza _acme-challenge_ujmmovf2vn55tgye.

    5. No campo Tipo de registo de recursos, selecione CNAME.

    6. No campo TTL, introduza um valor numérico positivo para o tempo de vida do registo de recursos, que é o tempo durante o qual pode ser armazenado em cache.

    7. Na lista Unidade de TTL, selecione a unidade de tempo, por exemplo, 30 minutes.

    8. No campo Nome canónico, introduza o valor completo do campo dnsResourceRecord.data, conforme apresentado no resultado do comando gcloud certificate-manager dns-authorizations describe.

    9. Para introduzir informações adicionais, clique em Adicionar item.

    10. Clique em Criar.

    gcloud

    Quando cria uma autorização de DNS, o comando da CLI gcloud devolve o registo CNAME correspondente. Para adicionar o registo CNAME à configuração do DNS na zona de DNS do domínio de destino, siga estes passos:

    1. Inicie a transação do registo DNS:

      gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"
      

      Substitua DNS_ZONE_NAME pelo nome da zona DNS de destino.

    2. Adicione o registo CNAME à zona DNS de destino:

      gcloud dns record-sets transaction add CNAME_RECORD \
          --name="VALIDATION_SUBDOMAIN_NAME.DOMAIN_NAME." \
          --ttl="30" \
          --type="CNAME" \
          --zone="DNS_ZONE_NAME"
      

      Substitua o seguinte:

      • CNAME_RECORD: o valor de dados completo do registo CNAME devolvido pelo comando da CLI do Google Cloud que criou a autorização de DNS correspondente.
      • VALIDATION_SUBDOMAIN_NAME: o subdomínio do prefixo da zona DNS, como _acme-challenge. Pode copiar o nome do registo TXT do registo de autorização de DNS a partir do registo de comandos gcloud certificate-manager dns-authorizations describe, conforme descrito em Crie uma autorização de DNS.
      • DOMAIN_NAME: o nome do domínio de destino.O nome do domínio tem de ser um nome do domínio totalmente qualificado, como myorg.example.com. Também tem de incluir o ponto final após o nome do domínio de destino.
      • DNS_ZONE_NAME: o nome da zona DNS de destino.

      Para mais informações acerca da diferença entre as autorizações de DNS FIXED_RECORD e PER_PROJECT_RECORD, consulte os seguintes exemplos. A única diferença entre os dois exemplos é o valor da flag --name.

      Autorização de DNS FIXED_RECORD

      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"
      

      Autorização de DNS PER_PROJECT_RECORD

      gcloud dns record-sets transaction add 0e40fc77-a37d-4eb8-8fe1-eea2e18d12d9.4.authorize.certificatemanager.goog. \
          --name="_acme-challenge_ujmmovf2vn55tgye.myorg.example.com." \
          --ttl="30" \
          --type="CNAME" \
          --zone="myorg-example-com"
      
    3. Execute a transação do registo de DNS para guardar as 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 registo CNAME à configuração do DNS, pode usar um google_dns_record_set recurso.

    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]
    }

    Valide o estado do certificado

    Antes de implementar um certificado num equilibrador de carga, verifique se está ativo. O estado do certificado pode demorar vários minutos a mudar para ACTIVE.

    Consola

    1. Na Google Cloud consola, aceda à página Gestor de certificados.

      Aceda ao Gestor de certificados

    2. No separador Certificados, verifique a coluna Estado do certificado.

    gcloud

    Para verificar o estado do certificado, execute o seguinte comando:

    gcloud certificate-manager certificates describe CERTIFICATE_NAME
    

    Substitua CERTIFICATE_NAME pelo nome do certificado gerido pela Google de destino.

    O resultado é semelhante ao seguinte:

    createTime: '2021-10-20T12:19:53.370778666Z'
    expireTime: '2022-05-07T05:03:49Z'
    managed:
      authorizationAttemptInfo:
      - domain: myorg.example.com
        state: AUTHORIZED
      dnsAuthorizations:
        - projects/myProject/locations/global/dnsAuthorizations/myCert
      domains:
      - myorg.example.com
      state: ACTIVE
    name: projects/myProject/locations/global/certificates/myCert
    pemCertificate: |
      -----BEGIN CERTIFICATE-----
      [...]
      -----END CERTIFICATE-----
    sanDnsnames:
      -   myorg.example.com
    updateTime: '2021-10-20T12:19:55.083385630Z'
    

    Se o estado do certificado não for ACTIVE após várias horas, verifique se adicionou corretamente o registo CNAME à configuração de DNS.

    Para ver mais passos de resolução de problemas, consulte o artigo Resolva problemas do Gestor de certificados.

    Implemente o certificado num balanceador de carga

    Para implementar o certificado global gerido pela Google, anexe-o diretamente ao proxy de destino.

    Anexe o certificado diretamente ao proxy de destino

    Pode anexar o certificado a um novo proxy de destino ou a um proxy de destino existente.

    Para anexar o certificado a um novo proxy de destino, use o gcloud compute target-https-proxies createcomando:

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

    Substitua o seguinte:

    • PROXY_NAME: o nome do proxy de destino.
    • URL_MAP: o nome do mapa de URLs. Criou o mapa de URLs quando criou o balanceador de carga.
    • CERTIFICATE_NAME: o nome do certificado.

    Para anexar o certificado a um proxy HTTPS de destino existente, use o gcloud compute target-https-proxies update comando. Se não souber o nome do proxy de destino existente, aceda à página Proxies de destino e anote o nome do proxy de destino.

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

    Depois de criar ou atualizar o proxy de destino, execute o seguinte comando para o verificar:

    gcloud compute target-https-proxies list
    

    Limpar

    Para evitar incorrer em custos na sua conta do Google Cloud relativos aos recursos usados neste tutorial, elimine-os.

    1. Elimine o balanceador de carga e os respetivos recursos.

      Consulte o artigo Limpe uma configuração de equilíbrio de carga.

    2. Elimine o certificado gerido pela Google:

      Consola

      1. Na Google Cloud consola, aceda à página Gestor de certificados.

        Aceda ao Gestor de certificados

      2. No separador Certificados, selecione a caixa de verificação do certificado.

      3. Clique em Eliminar.

      4. Na caixa de diálogo apresentada, clique em Eliminar para confirmar.

      gcloud

      gcloud certificate-manager certificates delete CERTIFICATE_NAME
      

      Substitua CERTIFICATE_NAME pelo nome do certificado de destino.

    3. Elimine 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.

    O que se segue?