部署具有 DNS 授权的全球 Google 管理的证书


本教程将介绍如何使用由 Google 管理的证书和 DNS 来完成证书部署流程 “授权”作为示例。

以下负载平衡器支持使用 DNS 的 Google 管理的证书 授权:

  • 全球外部应用负载均衡器
  • 传统应用负载均衡器
  • 跨区域内部应用负载均衡器
  • 全局外部代理网络负载均衡器

要对比受支持的网域授权类型,请参阅网域 授权

如果您想将现有证书迁移到 Certificate Manager,请改为按照将证书迁移到 Certificate Manager 中的步骤操作。

目标

本教程介绍如何完成以下任务:

  • 使用 Certificate Manager 创建由具有 DNS 授权的公开可信证书授权机构颁发的 Google 管理的证书。
  • 使用目标 HTTPS 代理将证书部署到受支持的负载均衡器。

如需详细了解证书部署过程,请参阅部署 概览

准备工作

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. 您需要使用 gcloud CLI 版本 465.0.0 或更高版本来部署证书。要检查您的 gcloud CLI 版本,请运行 以下命令:

    gcloud --version
    
  3. 如需更新 gcloud CLI,请运行以下命令。

    gcloud components update
    
  4. 请确保您拥有以下角色,以便完成本 教程:

    • Certificate Manager Owner:必须拥有此角色才能创建和管理 Certificate Manager 资源。
    • Compute Load Balancer AdminCompute Network Admin:需要 创建和管理 HTTPS 目标代理。
    • DNS 管理员:如果您想将 Cloud DNS 用作 DNS 解决方案,则必须拥有此角色。

    详情请参阅以下内容:

创建具有 DNS 授权的 Google 代管的证书

完成本部分中的步骤创建 DNS 授权和 引用该 DNS 授权的 Google 管理的证书。

创建 DNS 授权

按照本部分中的说明创建 DNS 授权。如果您要创建 通配符证书的 DNS 授权,例如 *.myorg.example.com 为父网域配置 DNS 授权,例如 myorg.example.com

gcloud

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

Google 管理的全球证书的默认 DNS 授权类型是 FIXED_RECORD。如需使用按项目 DNS 授权,请运行以下命令:

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

替换以下内容:

  • AUTHORIZATION_NAME:DNS 授权的名称。
  • DOMAIN_NAME:您要注册的网域的名称 创建此 DNS 授权。域名必须是完全限定的域名 域名,例如 myorg.example.com

该命令会返回类似于以下内容的输出。使用输出中的 CNAME 记录添加到您的 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

要创建 DNS 授权,您可以使用 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
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

将 CNAME 记录添加到您的 DNS 配置

如果您使用 Google Cloud 管理 DNS,请完成以下步骤 部分。否则,请参阅第三方 DNS 解决方案的相关文档。

在完成本部分中的步骤之前,请确保您已创建公共 DNS 区域

创建 DNS 授权后,gcloud CLI 命令会返回相应的 CNAME 记录。您必须将此 CNAME 记录添加到目标网域的 DNS 区域中的 DNS 配置,如下所示:

gcloud

  1. 发起 DNS 记录事务:

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

    DNS_ZONE_NAME 替换为目标 DNS 区域的名称。

  2. 将 CNAME 记录添加到目标 DNS 区域:

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

    替换以下内容:

    • CNAME_RECORD:用于创建相应 DNS 授权的 Google Cloud CLI 命令所返回的 CNAME 记录的完整数据值。
    • DOMAIN_NAME:目标网域的名称。域名必须是完全限定域名,例如 myorg.example.com。您还必须添加 目标域名。
    • DNS_ZONE_NAME:目标 DNS 区域的名称。

    请参阅以下示例:

    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"
    
  3. 运行 DNS 记录事务以保存更改:

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

    DNS_ZONE_NAME 替换为目标 DNS 的名称 可用区。

Terraform

要将 CNAME 记录添加到 DNS 配置,您可以使用 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]
}

创建引用 DNS 授权的 Google 管理的证书

要创建引用 DNS 授权的 Google 管理的证书,请执行以下操作: 创建过滤器,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 Certificate Manager 页面。

    前往 Certificate Manager

  2. 在随即显示的页面上,选择证书标签页。

  3. 点击添加证书

  4. 输入证书的名称

    该名称在项目中必须是唯一的。

  5. 可选:输入证书的说明。说明 可帮助您稍后识别特定证书。

  6. 对于位置,选择全局

  7. 对于范围,请选择以下任一选项:

    1. 默认:对于全球外部应用负载均衡器传统应用负载均衡器全球外部代理网络负载均衡器,请选择“默认”
    2. 所有区域:为跨区域内部应用负载平衡器选择所有区域
  8. 对于证书类型,选择创建 Google 管理的证书

  9. 对于证书授权机构类型,选择公开

  10. 指定证书的域名。请输入以英文逗号分隔 目标网域的列表。此外,每个域名都必须是完全限定域名,例如 myorg.example.com

  11. 授权类型中,选择 DNS 授权。如果 域名具有关联的 DNS 授权,系统会自动获取该授权。如果域名没有关联的 DNS 授权,请执行以下操作:

    1. 点击创建缺失的 DNS 授权以显示“创建 DNS” 授权对话框。
    2. DNS 授权名称字段中,指定 DNS 授权名称。
    3. 点击创建 DNS 授权。 验证 DNS 名称是否与域名相关联。
  12. 指定要与证书关联的标签。您可以添加 多个标签(如果需要)。如需添加标签,请点击 添加标签按钮,并为标签指定 keyvalue

  13. 点击创建。确认新证书是否显示在证书列表中。

gcloud

对于全球外部应用负载均衡器、传统应用负载均衡器或全球外部代理网络负载均衡器

运行以下命令:

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

替换以下内容:

  • CERTIFICATE_NAME:证书的唯一名称。
  • DOMAIN_NAME:证书的目标网域。 域名必须是完全限定域名,例如 myorg.example.com
  • AUTHORIZATION_NAME:您为此证书创建的 DNS 授权的名称。

如需创建带有通配符域名的 Google 管理的证书,请使用 。通配符域名 证书涵盖指定网域的所有一级子网域。

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

替换以下内容:

  • CERTIFICATE_NAME:证书的唯一名称。
  • DOMAIN_NAME:证书的目标网域。星号点前缀 (*.) 表示通配符证书。网域 必须是完全限定域名,例如 myorg.example.com
  • AUTHORIZATION_NAME:DNS 授权的名称 您为此证书创建的凭据。

对于跨区域内部应用负载均衡器

运行以下命令:

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

替换以下内容:

  • CERTIFICATE_NAME:证书的唯一名称。
  • DOMAIN_NAME:证书的目标网域。 域名必须是完全限定域名,例如 myorg.example.com
  • AUTHORIZATION_NAME:您为此证书创建的 DNS 授权的名称。

如需使用通配符域名创建 Google 管理的证书,请使用以下命令。通配符域名证书涵盖给定网域的所有第一级子网域。

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

替换以下内容:

  • CERTIFICATE_NAME:证书的唯一名称。
  • DOMAIN_NAME:证书的目标网域。星号点前缀 (*.) 表示通配符证书。域名必须是完全限定域名,例如 myorg.example.com
  • AUTHORIZATION_NAME:您为此证书创建的 DNS 授权的名称。

Terraform

使用 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
  }
}

验证证书是否有效

在将证书部署到负载均衡器之前,请使用以下命令验证证书本身是否处于活跃状态。证书状态可能需要长达几个小时才能更改为 ACTIVE

gcloud certificate-manager certificates describe CERTIFICATE_NAME

CERTIFICATE_NAME 替换为目标的名称 Google 管理的证书。

该命令会返回类似于以下内容的输出:

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
pemCertificate: |
  -----BEGIN CERTIFICATE-----
  [...]
  -----END CERTIFICATE-----
sanDnsnames:
-   myorg.example.com
updateTime: '2021-10-20T12:19:55.083385630Z'

将证书部署到负载均衡器

本部分详细介绍了部署由 Google 管理的 证书上传到负载均衡器。

在继续执行本部分中的任务之前,请确保您已完成 “管理”部分中列出的任务 创建具有 DNS 授权的 Google 管理的证书 部分。

您可以根据负载均衡器类型,按如下方式部署证书:

使用证书映射部署证书

本部分介绍了使用证书部署证书的步骤 地图。

创建证书映射

创建证书映射 引用证书映射条目的 与您的证书关联的资源:

gcloud

gcloud certificate-manager maps create CERTIFICATE_MAP_NAME

CERTIFICATE_MAP_NAME 替换为目标的名称 证书映射。

Terraform

如需创建证书映射,您可以使用 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
  }
}

创建证书映射条目

创建证书映射条目 并将其与您的 证书为 以及您的证书映射

gcloud

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

替换以下内容:

  • CERTIFICATE_MAP_ENTRY_NAME:证书映射条目的唯一名称
  • CERTIFICATE_MAP_NAME:此证书映射条目关联到的证书映射的名称
  • CERTIFICATE_NAME:所需证书的名称 关联此证书映射条目
  • HOSTNAME:您要关联的主机名 替换为此证书映射条目。

如果您要使用通配符网域创建证书,请也使用通配符指定主机名,例如 *.example.com

Terraform

如需创建证书映射条目,您可以使用 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
}

验证证书映射条目是否处于有效状态

在将相应的证书映射关联到目标代理之前,请使用以下命令验证证书映射条目是否处于活跃状态:

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

替换以下内容:

  • CERTIFICATE_MAP_ENTRY_NAME:目标的名称 证书映射条目
  • CERTIFICATE_MAP_NAME:映射到的证书的名称 该证书映射条目会附加

该命令会返回类似于以下内容的输出:

certificates:
createTime: '2021-09-06T10:01:56.229472109Z'
hostname: example.com
name: projects/my-project/locations/global/certificateMaps/myCertMap/certificateMapEntries/myCertMapEntry
state: ACTIVE
updateTime: '2021-09-06T10:01:58.277031787Z'

将证书映射附加到目标代理

将配置的证书映射附加到目标代理:

gcloud

  1. 在 Google Cloud 控制台中,转到目标代理页面。

    前往“目标”页面 指标

  2. 请记下目标代理的名称。

  3. 将证书映射附加到目标代理:

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

    替换以下内容:

    • PROXY_NAME:目标代理的名称。
    • CERTIFICATE_MAP_NAME:证书的名称 引用您的证书映射条目和 证书。

Terraform

如需将证书映射附加到目标代理,您可以使用 google_compute_target_https_proxy 资源

配置目标代理时,直接附加 TLS (SSL) 证书 以及通过证书映射,代理会使用引用的证书 并忽略直接附加的 TLS (SSL) 证书。

将证书直接附加到目标代理

如需将证书直接附加到代理,请运行以下命令:

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

替换以下内容:

  • PROXY_NAME:代理的唯一名称。
  • URL_MAP:网址映射的名称。您在创建负载均衡器时创建了网址映射。
  • CERTIFICATE_NAME:证书的名称。

清理

如需还原您在本教程中所做的更改,请完成以下操作 步骤:

  1. 将证书映射与代理分离。

    在分离证书映射之前,请注意以下事项:

    • 如果有任何 TLS (SSL) 证书直接附加到代理,则解除证书映射会导致代理恢复使用这些直接附加的 TLS (SSL) 证书。
    • 如果没有直接附加到代理的 TLS (SSL) 证书,则无法将证书映射与代理分离。您必须先将至少一个 TLS (SSL) 证书直接附加到代理,然后才能分离证书映射。

    如需分离证书映射,请运行以下命令:

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

    PROXY_NAME 替换为目标代理的名称。

  2. 从证书映射中删除证书映射条目:

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

    替换以下内容:

    • CERTIFICATE_MAP_ENTRY_NAME:目标的名称 证书映射条目。
    • CERTIFICATE_MAP_NAME:目标的名称 证书映射。
  3. 删除证书映射:

    gcloud certificate-manager maps delete CERTIFICATE_MAP_NAME
    

    CERTIFICATE_MAP_NAME 替换为目标的名称 证书映射。

  4. 删除 Google 托管的证书:

    gcloud certificate-manager certificates delete CERTIFICATE_NAME
    

    CERTIFICATE_NAME 替换为目标证书的名称。

  5. 删除 DNS 授权:

    gcloud certificate-manager dns-authorizations delete AUTHORIZATION_NAME
    

    AUTHORIZATION_NAME 替换为目标的名称 DNS 授权。

后续步骤