本教程介绍了如何使用证书管理器部署具有 DNS 授权的 Google 管理的全球证书。
以下全球负载平衡器支持具有 DNS 授权的 Google 管理的证书:
- 全球外部应用负载均衡器
- 传统应用负载均衡器
- 全局外部代理网络负载均衡器
如果您想部署到跨区域负载平衡器或区域级负载平衡器,请参阅以下内容:
创建具有 DNS 授权的 Google 管理的证书
在创建证书之前,请先创建公共 DNS 区域。然后,创建 DNS 授权并将 CNAME 记录添加到目标 DNS 区域。
创建 DNS 授权
DNS 授权仅涵盖单个域名。您必须为要用于目标证书的每个域名单独创建 DNS 授权。
如果您要为通配符证书(例如 *.myorg.example.com)创建 DNS 授权,请为父网域(例如 myorg.example.com)配置 DNS 授权。
控制台
您可以在创建证书时创建 DNS 授权或附加现有 DNS 授权。如需了解详情,请参阅创建引用 DNS 授权的 Google 管理的证书。
gcloud
您可以创建两种类型的 DNS 授权:FIXED_RECORD 或 PER_PROJECT_RECORD。如需了解详情,请参阅 DNS 授权。
FIXED_RECORD DNS 授权
如需创建 FIXED_RECORD DNS 授权,请使用以下 gcloud certificate-manager dns-authorizations create 命令:
gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
--domain="DOMAIN_NAME" \
--type=[FIXED_RECORD]
替换以下内容:
AUTHORIZATION_NAME:DNS 授权的名称。DOMAIN_NAME:您要为其创建此 DNS 授权的目标网域的名称。域名必须是完全限定域名,例如myorg.example.com。
创建 FIXED_RECORD DNS 授权后,请使用 gcloud certificate-manager dns-authorizations describe 命令对其进行验证:
gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME
输出类似于以下内容:在输出中找到 dnsResourceRecord 部分。找到 CNAME 记录,并将该记录的详细信息(data、name 和 type)添加到您的 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'
PER_PROJECT_RECORD DNS 授权
如需创建 PER_PROJECT_RECORD DNS 授权,请使用以下 gcloud certificate-manager dns-authorizations create 命令:
gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
--domain="DOMAIN_NAME" \
--type=PER_PROJECT_RECORD
替换以下内容:
AUTHORIZATION_NAME:DNS 授权的名称。DOMAIN_NAME:您要为其创建此 DNS 授权的目标网域的名称。域名必须是完全限定域名,例如myorg.example.com。
创建 PER_PROJECT_RECORD DNS 授权后,请使用 gcloud certificate-manager dns-authorizations describe 命令对其进行验证:
gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME
输出类似于以下内容:在输出中找到 dnsResourceRecord 部分。找到 CNAME 记录,并将该记录的详细信息(data、name 和 type)添加到您的 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'
Terraform
如需创建 DNS 授权,您可以使用 google_certificate_manager_dns_authorization 资源。
如需了解如何应用或移除 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 管理的证书,请执行以下操作:
控制台
在 Google Cloud 控制台中,前往 Certificate Manager 页面。
在证书标签页上,点击添加证书。
在证书名称字段中,输入证书的唯一名称。
可选:在说明字段中,输入证书的说明。通过说明,您可以识别证书。
在位置部分,选择全球。
对于范围,选择默认。
在证书类型部分,选择创建 Google 管理的证书。
对于证书授权机构类型,请选择公开。
在域名字段中,指定以英文逗号分隔的证书域名列表。每个域名都必须是完全限定域名,例如
myorg.example.com。域名也可以是通配符域名,例如*.example.com。对于授权类型,请选择 DNS 授权。
该页面会列出网域名的 DNS 授权。如果某个域名没有关联的 DNS 授权,请按以下步骤创建:
- 点击创建缺少的 DNS 授权。
- 在 DNS 授权名称字段中,指定 DNS 授权的名称。
默认 DNS 授权类型为
FIXED_RECORD。如需在多个项目中独立管理证书,请选中按项目授权复选框。 - 点击创建 DNS 授权。
在标签字段中,指定要与证书关联的标签。如需添加标签,请点击添加标签,并为标签指定键和值。
点击创建。
新证书会显示在证书列表中。
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
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,请完成本部分中的步骤。
控制台
要创建记录集,请按以下步骤操作:
在 Google Cloud 控制台中,前往 DNS 区域页面。
点击要添加记录的 DNS 区域的名称。
在区域详情页面上,点击添加标准。
在创建记录集页面的 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。
在资源记录类型字段中,选择 CNAME。
在 TTL 字段中,输入一个正数值表示资源记录的生存时间,即该资源记录可缓存的时间期限。
从 TTL 单位列表中,选择时间单位,例如
30 minutes。在规范名称字段中,输入
dnsResourceRecord.data字段的完整值,如gcloud certificate-manager dns-authorizations describe命令的输出中所示。要输入其他信息,请点击添加一项。
点击创建。
gcloud
创建 DNS 授权后,gcloud CLI 命令会返回相应的 CNAME 记录。如需将 CNAME 记录添加到目标网域的 DNS 区域中的 DNS 配置,请按以下步骤操作:
发起 DNS 记录事务:
gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"
将
DNS_ZONE_NAME替换为目标 DNS 区域的名称。将 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。您可以按照创建 DNS 授权中的说明,从gcloud certificate-manager dns-authorizations describe命令日志中复制该名称。DOMAIN_NAME:目标网域的名称。网域名称必须是完全限定域名,例如myorg.example.com。您还必须在目标域名后添加尾随英文句点。DNS_ZONE_NAME:目标 DNS 区域的名称。
如需详细了解
FIXED_RECORD和PER_PROJECT_RECORDDNS 授权之间的区别,请参阅以下示例。这两个示例的唯一区别在于--name标志的值。FIXED_RECORD 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"PER_PROJECT_RECORD DNS 授权
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"运行 DNS 记录事务以保存更改:
gcloud dns record-sets transaction execute --zone="DNS_ZONE_NAME"
将
DNS_ZONE_NAME替换为目标 DNS 区域的名称。
Terraform
如需将 CNAME 记录添加到您的 DNS 配置,您可以使用 google_dns_record_set 资源。
验证证书的状态
在将证书部署到负载均衡器之前,请验证证书是否处于有效状态。证书状态可能需要几分钟才能变为 ACTIVE。
控制台
在 Google Cloud 控制台中,前往 Certificate Manager 页面。
在证书标签页上,查看证书的状态列。
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 资源。
创建证书映射条目
创建证书映射条目,并将其与您的证书和证书映射相关联:
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:您要与证书映射条目相关联的主机名。如果您想创建涵盖通配符网域和根网域的证书,请指定包含根网域和通配符的 hostname,例如
example.com和*.example.com。此外,您还必须指定两个证书映射条目,一个用于example.com,另一个用于*.example.com。
Terraform
如需创建包含根网域的证书映射条目,请使用 google_certificate_manager_certificate_map_entry 资源。
如需创建包含通配符网域的证书映射条目,请使用 google_certificate_manager_certificate_map_entry 资源。
验证证书映射条目是否处于有效状态
在将相应的证书映射关联到目标代理之前,请验证证书映射条目是否处于活跃状态。
如需验证证书映射条目,请使用 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) 证书,则代理会使用证书映射引用的证书,并忽略直接附加的 TLS (SSL) 证书。
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除这些资源。
删除负载均衡器及其资源。
请参阅清理负载均衡设置。
从代理中删除或分离证书映射。
如需删除证书映射,请运行以下命令:
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替换为目标代理的名称。从证书映射中删除证书映射条目:
gcloud certificate-manager maps entries delete CERTIFICATE_MAP_ENTRY_NAME \ --map="CERTIFICATE_MAP_NAME"替换以下内容:
CERTIFICATE_MAP_ENTRY_NAME:证书映射条目的名称。CERTIFICATE_MAP_NAME:证书映射的名称。
删除证书映射:
gcloud certificate-manager maps delete CERTIFICATE_MAP_NAME
将
CERTIFICATE_MAP_NAME替换为证书映射的名称。删除 Google 托管的证书:
控制台
在 Google Cloud 控制台中,前往 Certificate Manager 页面。
在证书标签页上,选中相应证书的复选框。
点击删除。
在显示的对话框中,点击删除进行确认。
gcloud
gcloud certificate-manager certificates delete CERTIFICATE_NAME
将
CERTIFICATE_NAME替换为目标证书的名称。删除 DNS 授权:
gcloud certificate-manager dns-authorizations delete AUTHORIZATION_NAME
将
AUTHORIZATION_NAME替换为 DNS 授权的名称。