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


本教程以具有 DNS 授权的 Google 管理证书为例,引导您完成证书部署流程

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

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

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

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

目标

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

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

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

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  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 授权。如果要为通配符证书(例如 *.myorg.example.com)创建 DNS 授权,请为父网域(例如 myorg.example.com)配置 DNS 授权。

gcloud

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

如需使用项目级 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 区域的名称。

  1. 将 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"
  
  1. 运行 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 管理的证书

如需创建 Google 管理的证书来引用您在前面的步骤中创建的 DNS 授权,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往证书管理器页面。

    前往“证书管理器”

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

  3. 点击添加证书

  4. 输入证书的名称

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

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

  6. 对于位置,选择 Global

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

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

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

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

  11. 对于 Authorization type(授权类型),选择 DNS Authorization(DNS 授权)。如果域名具有关联的 DNS 授权,则系统会自动进行选择。如果域名没有关联的 DNS 授权,请执行以下操作:

    1. 点击 Create missing DNS Authorization(创建缺失的 DNS 授权)以显示“Create DNS Authorization”对话框。
    2. DNS Authorization Name(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:您要与此证书映射条目关联的主机名

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 授权的名称。

后续步骤