本教程介绍如何使用证书管理服务将第三方证书迁移到Google Cloud 负载均衡器。
如需在不中断服务的情况下迁移第三方证书,请创建与第三方证书数量相同的 Google 管理型证书。接下来,将证书整合到单个证书映射中,并使用 DNS 将证书映射部署到负载均衡器。最后,更新 DNS A 和 AAAA 记录以指向负载均衡器的 IP 地址。
如需查看受支持的负载平衡器列表,请参阅 Certificate Manager 概览。
创建 Google 管理的证书
创建与第三方证书数量相同的具有 DNS 授权的 Google 管理的证书(推荐)或自行管理的证书。在创建证书之前,请先创建 DNS 授权,然后将 CNAME 记录添加到您网域的权威 DNS 区域。
本部分列出了创建全局 Google 管理型证书的步骤和命令。如需创建区域级或跨区域的 Google 管理的证书,请参阅创建 Google 管理的证书。
创建 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_RECORD
DNS 授权之间的区别,请参阅以下示例。这两个示例的唯一区别在于--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 管理的全局证书,请按照本部分中的步骤操作,并使用证书映射部署证书。
如需将 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) 证书。
测试已部署的证书
对于您部署的每个证书,请使用以下命令测试与负载均衡器的 IP 地址上证书所涵盖的每个网域的连接:
openssl s_client -showcerts -servername DOMAIN_NAME -connect IP_ADDRESS:443
替换以下内容:
DOMAIN_NAME
:目标网域的名称IP_ADDRESS
:负载均衡器的 IP 地址
如需详细了解如何测试连接,请参阅使用 OpenSSL 进行测试
更新 DNS 记录
将流量从第三方服务切换到 Cloud Load Balancing。请参阅更新 DNS A 和 AAAA 记录以指向负载均衡器的 IP 地址。