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


本教程介绍了如何使用证书管理器部署具有 DNS 授权的全球 Google 代管证书。

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

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

如果您想部署到跨区域负载平衡器或区域级负载平衡器,请参阅以下内容:

目标

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

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

准备工作

  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.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine, Certificate Manager APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

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

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Compute Engine, Certificate Manager APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. 创建公开 DNS 区域

所需的角色

请确保您拥有以下角色,才能完成本教程中的任务:

  • Certificate Manager Owner (roles/certificatemanager.owner)

    创建和管理 Certificate Manager 资源所必需。

  • Compute Load Balancer Admin (roles/compute.loadBalancerAdmin) 或 Compute Network Admin (roles/compute.networkAdmin)

    必须拥有此角色才能创建和管理 HTTPS 目标代理。

  • DNS Administrator (roles/dns.admin)

    如果您想将 Cloud DNS 用作 DNS 解决方案,则必须提供。

详情请参阅以下内容:

域名

如需创建证书,请获取您拥有的网域的完全限定域名 (FQDN)。如果您没有域名,可以使用 Cloud Domains 注册域名

创建负载均衡器

本教程假定您已创建并配置了负载平衡器的后端、健康检查、后端服务和网址映射。如果您创建了外部应用负载平衡器,请记下网址映射的名称,因为您需要在本教程稍后的内容中使用该名称。

如果您尚未创建负载平衡器,请参阅以下页面进行创建:

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

在创建证书之前,请先创建一个公共 DNS 区域。然后,创建 DNS 授权并将 CNAME 记录添加到目标 DNS 区域。

创建 DNS 授权

DNS 授权仅涵盖单个域名。您必须为要与目标证书搭配使用的每个网域名分别创建 DNS 授权。

如果您要为通配符证书(例如 *.myorg.example.com)创建 DNS 授权,请为父级网域(例如 myorg.example.com)配置 DNS 授权。

控制台

您可以在创建证书时创建 DNS 授权或附加现有 DNS 授权。如需了解详情,请参阅创建引用 DNS 授权的 Google 管理的证书

gcloud

如需创建 DNS 授权,请使用 certificate-manager dns-authorizations create 命令

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

替换以下内容:

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

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

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

创建 DNS 授权后,请使用 certificate-manager dns-authorizations describe 命令对其进行验证:

gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME \

输出类似于以下内容:在输出中,找到 dnsResourceRecord 行,然后获取 CNAME 记录(datanametype),以添加到您的 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 命令

API

如需创建 DNS 授权,请向 dnsAuthorizations.create 方法发出 POST 请求:

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

替换以下内容:

  • PROJECT_ID:Google Cloud 项目的 ID。
  • AUTHORIZATION_NAME:DNS 授权的名称。
  • DOMAIN_NAME:您要为其创建此 DNS 授权的目标网域的名称。域名必须是完全限定域名,例如 myorg.example.com

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

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

控制台

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

    前往 Certificate Manager

  2. 证书标签页上,点击添加证书

  3. 证书名称字段中,为证书输入一个唯一名称。

  4. 可选:在说明字段中,输入证书的说明。您可以通过说明来识别证书。

  5. 位置部分,选择全球

  6. 对于范围,选择默认

  7. 证书类型部分,选择创建 Google 管理的证书

  8. 对于证书授权机构类型,请选择公共

  9. 网域名称字段中,指定证书的域名(以英文逗号分隔)列表。每个域名都必须是完全限定域名,例如 myorg.example.com。域名还可以是通配符域名,例如 *.example.com

  10. 对于授权类型,请选择 DNS 授权

    该页面列出了域名的 DNS 授权。如果域名没有关联的 DNS 授权,请按以下步骤创建一个:

    1. 点击创建缺少的 DNS 授权
    2. DNS 授权名称字段中,指定 DNS 授权的名称。 默认 DNS 授权类型为 FIXED_RECORD。如需独立管理多个项目中的证书,请选中按项目授权复选框。
    3. 点击创建 DNS 授权
  11. 标签字段中,指定要与证书关联的标签。如需添加标签,请点击 添加标签,然后为标签指定键和值。

  12. 点击创建

    新证书会显示在证书列表中。

gcloud

如需创建具有 DNS 授权的全球 Google 代管的证书,请使用 dns-authorizations 标志运行 certificate-manager certificates create 命令

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

替换以下内容:

  • CERTIFICATE_NAME:证书的名称。
  • DOMAIN_NAME:目标网域的名称。域名必须是完全限定域名(例如 myorg.example.com)或通配符域名(例如 *.myorg.example.com)。星号点前缀 (*.) 表示通配符证书。
  • AUTHORIZATION_NAMES:您为证书创建的 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
  }
}

API

certificates.create 方法发出 POST 请求,以创建证书,如下所示:

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

替换以下内容:

  • PROJECT_ID:Google Cloud 项目的 ID。
  • CERTIFICATE_NAME:证书的名称。
  • DOMAIN_NAME:目标网域的名称。域名必须是完全限定域名(例如 myorg.example.com)或通配符域名(例如 *.myorg.example.com)。星号点前缀 (*.) 表示通配符证书。
  • AUTHORIZATION_NAMES:DNS 授权名称的逗号分隔列表。

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

如果您使用第三方 DNS 解决方案来管理 DNS,请参阅其文档,将 CNAME 记录添加到 DNS 配置中。如果您使用Google Cloud 管理 DNS,请完成本部分中的步骤。

控制台

要创建记录集,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 DNS 区域页面。

    转到 Cloud DNS 可用区

  2. 点击要添加记录的 DNS 区域的名称。

  3. 区域详情页面上,点击添加标准

  4. 创建记录集页面的 DNS 名称字段中,输入 DNS 区域的子网域。

    输入子网域名称时,请确保子网域名称(包括 DNS 名称字段中显示的灰显文本)与 gcloud certificate-manager dns-authorizations describe 命令的输出中显示的 dnsResourceRecord.name 字段的完整值相匹配。

    请参见以下示例:

    • 如果 dnsResourceRecord.name 字段值为 _acme-challenge.myorg.example.com.,并且 DNS 名称字段中的灰显文本为 .example.com.,请输入 _acme-challenge.myorg

    • 如果 dnsResourceRecord.name 字段值为 _acme-challenge.myorg.example.com.,并且 DNS 名称字段中的灰显文本为 .myorg.example.com.,请输入 _acme-challenge

    • 如果 dnsResourceRecord.name 字段的值为 _acme-challenge_ujmmovf2vn55tgye.myorg.example.com.,并且 DNS 名称字段中的灰显文本为 .myorg.example.com.,请输入 _acme-challenge_ujmmovf2vn55tgye

  5. 资源记录类型字段中,选择 CNAME

  6. TTL 字段中,输入一个正数值表示资源记录的生存时间,即该资源记录可缓存的时间期限。

  7. TTL 单位列表中,选择时间单位,例如 30 minutes

  8. 规范名称字段中,输入 dnsResourceRecord.data 字段的完整值(如 gcloud certificate-manager dns-authorizations describe 命令的输出中所显示)。

  9. 要输入其他信息,请点击添加一项

  10. 点击创建

gcloud

创建 DNS 授权后,gcloud CLI 命令会返回相应的 CNAME 记录。如需将 CNAME 记录添加到目标网域的 DNS 区域中的 DNS 配置,请按以下步骤操作:

  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="VALIDATION_SUBDOMAIN_NAME.DOMAIN_NAME." \
        --ttl="30" \
        --type="CNAME" \
        --zone="DNS_ZONE_NAME"
    

    替换以下内容:

    • CNAME_RECORD:用于创建相应 DNS 授权的 Google Cloud CLI 命令所返回的 CNAME 记录的完整数据值。
    • VALIDATION_SUBDOMAIN_NAME:DNS 区域的前缀子网域,例如 _acme-challenge。您可以从 gcloud certificate-manager dns-authorizations describe 命令日志中复制该名称,如创建 DNS 授权中所述。
    • 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]
}

验证证书状态

在将证书部署到负载平衡器之前,请验证证书是否处于有效状态。证书状态可能需要几分钟才能更改为 ACTIVE

控制台

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

    前往 Certificate Manager

  2. 证书标签页中,查看证书的状态列。

gcloud

如需验证证书的状态,请运行以下命令:

gcloud certificate-manager certificates describe CERTIFICATE_NAME

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

输出类似于以下内容:

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'

如果证书状态在几个小时后仍不是 ACTIVE,请检查您是否已正确将 CNAME 记录添加到 DNS 配置中。

如需了解更多问题排查步骤,请参阅Certificate Manager 问题排查

将证书部署到负载平衡器

如需部署由 Google 管理的全球证书,请使用证书映射部署证书。

创建证书映射

创建一个证书映射,引用与您的证书关联的证书映射条目:

gcloud

如需创建证书映射,请使用 gcloud certificate-manager maps create 命令

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 命令

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 命令

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

替换以下内容:

  • CERTIFICATE_MAP_ENTRY_NAME:证书映射条目的名称。
  • CERTIFICATE_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

如需将证书映射附加到新的目标代理,请使用 gcloud compute target-https-proxies create 命令

gcloud compute target-https-proxies create PROXY_NAME \
    --certificate-map="CERTIFICATE_MAP_NAME" \
    --url-map="URL_MAP" \
    --global

替换以下内容:

  • PROXY_NAME:目标代理的名称。
  • CERTIFICATE_MAP_NAME:引用证书映射条目及其关联证书的证书映射的名称。
  • URL_MAP:网址映射的名称

如需将证书映射附加到现有目标 HTTPS 代理,请使用 gcloud compute target-https-proxies update 命令。如果您不知道现有目标代理的名称,请前往目标代理页面,并记下目标代理的名称。

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

创建或更新目标代理后,请运行以下命令进行验证:

gcloud compute target-https-proxies list

Terraform

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

配置目标代理时,如果您直接附加 TLS (SSL) 证书,同时还通过证书映射附加证书,则代理会使用证书映射引用的证书,并忽略直接附加的 TLS (SSL) 证书。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请将其删除。

  1. 删除负载平衡器及其资源。

    请参阅清理负载均衡设置

  2. 删除证书映射或将其与代理分离。

    如需删除证书映射,请运行以下命令:

    gcloud compute target-https-proxies delete PROXY_NAME
    

    如果您想保留目标 HTTPS 代理,请将证书映射与代理分离。在分离证书映射之前,请注意以下事项:

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

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

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

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

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

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

    替换以下内容:

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

    gcloud certificate-manager maps delete CERTIFICATE_MAP_NAME
    

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

  5. 删除 Google 托管的证书:

    控制台

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

      前往 Certificate Manager

    2. 证书标签页上,选中相应证书的复选框。

    3. 点击删除

    4. 在显示的对话框中,点击删除进行确认。

    gcloud

    gcloud certificate-manager certificates delete CERTIFICATE_NAME
    

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

  6. 删除 DNS 授权:

    gcloud certificate-manager dns-authorizations delete AUTHORIZATION_NAME
    

    AUTHORIZATION_NAME 替换为 DNS 授权的名称。

后续步骤