使用由 Google 管理的 SSL 证书

本页面介绍如何创建和使用 Google 管理的 SSL 证书。

Google 管理的 SSL 证书是 Google Cloud 为您的网域获取和管理的网域验证 (DV) 证书。支持每个证书有多个主机名,Google 会自动续订证书。

您必须为某些类型的 Google Cloud 负载平衡器提供 SSL 证书,这些负载平衡器包括:

您还可以将代管式 SSL 证书与 Google Kubernetes Engine 搭配使用。如需了解详情,请参阅使用 Google 管理的 SSL 证书

您可以在创建负载平衡器之前、期间或之后创建 Google 管理的证书。本页面假定您是在创建负载平衡器之前或之后(而不是创建期间)创建证书。要在创建负载平衡器时创建证书,请参阅负载平衡器方法指南页面。

多个网域

支持多个主题备用名称。每个 Google 管理的 SSL 证书可支持的网域数量有上限

如果您拥有的网域数量已超过上限,则必须请求多个 Google 管理的证书。例如,如果您尝试创建包含(数量上限 + 1 个)网域的 Google 管理的证书,则 Google 不会颁发任何证书。您必须创建两个或更多 Google 管理的证书,并明确说明每个证书与哪些网域相关联。

Google Cloud 根据 RFC 6066 的规定,实施服务器名称指示 (SNI)。

如果托管证书中的任何网域或子网域未指向负载平衡器的 IP 地址,则续订过程将失败。为避免续订失败,请确保您的所有网域和子网域都指向负载平衡器的 IP 地址。

准备工作

权限

若要按照本指南操作,您必须能够在项目中创建和修改 SSL 证书。如果存在以下任一情况,您可以执行此操作:

第 1 步:创建 Google 管理的 SSL 证书

您可以在创建负载平衡器之前、期间或之后创建 Google 管理的证书。在 Cloud Console 中创建负载平衡器的过程中,您可以使用 Cloud Console 来创建证书。或者,您也可以在创建负载平衡器之前或之后创建证书。此步骤向您介绍了如何创建证书,以供稍后添加到一个或多个负载平衡器。

如果您已经创建了 Google 管理的 SSL 证书,则可以跳过此步骤。

控制台

您可以在负载平衡页面的证书标签页上使用全局 SSL 证书。

  1. 转到 Google Cloud Console 中的证书标签页。
    转到证书标签页
  2. 点击创建 SSL 证书
  3. 为证书输入名称和可选说明。
  4. 选择创建 Google 托管的证书
  5. 添加网域。
  6. 点击创建

gcloud

如需为外部 HTTP(S) 负载平衡器或 SSL 代理负载平衡器创建由 Google 管理的全局 SSL 证书,请使用 gcloud compute ssl-certificates create 命令:

gcloud compute ssl-certificates create CERTIFICATE_NAME \
    --description=DESCRIPTION \
    --domains=DOMAIN_LIST \
    --global

将下列占位符替换为有效值:

  • CERTIFICATE_NAME:全球 SSL 证书的名称
  • DESCRIPTION:全球 SSL 证书的说明
  • DOMAIN_LIST:用于此证书的单个域名或英文逗号分隔的域名列表

API

创建 Google 管理的证书资源 sslCertificates.insert 方法,注意将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/sslCertificates
{
  "name": "ssl-certificate-name",
  "managed": {
    "domains": [
      "www.example.com"
    ]
  },
  "type": "MANAGED"
}

检查 Google 管理的 SSL 证书的状态

控制台

您可以在负载平衡页面的证书标签页上查看全局 SSL 证书的状态。

  1. 转到 Google Cloud Console 中的“证书”页面。
    转到“证书”页面
  2. (可选)过滤 SSL 证书列表。
  3. 查看状态列。
  4. 如需查看更多详细信息,请点击证书名称。

gcloud

如需确定 Google 管理的证书的状态,您可以使用 gcloud compute 命令。运行相应命令后,请注意以下方面:

  • 代管状态。
  • 网域状态。

如需列出 Google 管理的 SSL 证书,请使用带有 --global 标志的 gcloud compute ssl-certificates list 命令。

gcloud compute ssl-certificates list \
   --global

您可以使用 gcloud compute ssl-certificates describe 命令,注意替换 CERTIFICATE_NAME

gcloud compute ssl-certificates describe CERTIFICATE_NAME \
   --global \
   --format="get(name,managed.status, managed.domainStatus)"

此时,证书状态和网域状态为 PROVISIONING。完成本页中的步骤后,状态就会更改为 ACTIVE

如需详细了解这些状态,请参阅问题排查页面

第 2 步:创建或更新负载平衡器

要变为 ACTIVE 状态,Google 管理的 SSL 证书必须与负载平衡器(具体而言,即负载平衡器的目标代理)关联。

创建 SSL 证书并且其处于 PROVISIONING 状态后,您可以在创建负载平衡器期间使用该证书,如以下方法指南所述:

或者,您可以用它来更新现有的负载平衡器,如下所述:

控制台

当您使用 Google Cloud Console 更新外部 HTTP(S) 负载平衡器或 SSL 代理负载平衡器时,Google Cloud 会自动将您的 SSL 证书与正确的目标代理关联。

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 点击您的负载平衡器的名称。
  3. 点击修改
  4. 点击前端配置
  5. 点击正确的前端(必须为 HTTPS、HTTP/2、SSL)。
  6. 点击其他证书,然后从下拉列表中选择您的由 Google 管理的证书。
  7. 点击创建

gcloud

如需将 SSL 证书与外部 HTTP(S) 负载平衡器的目标 HTTPS 代理相关联,请使用带有 --global-ssl-certificates--global 标志的 gcloud compute target-https-proxies update 命令:

gcloud compute target-https-proxies update TARGET_PROXY_NAME \
    --ssl-certificates SSL_CERTIFICATE_LIST \
    --global-ssl-certificates \
    --global

如需将 SSL 证书与 SSL 代理负载平衡器的目标 SSL 代理相关联,请使用 gcloud compute target-ssl-proxies update 命令:

gcloud compute target-ssl-proxies update TARGET_PROXY_NAME \
    --ssl-certificates SSL_CERTIFICATE_LIST

请将占位符替换为有效值:

每个目标 HTTPS 代理或目标 SSL 代理都必须引用至少一个 SSL 证书。目标代理可以引用多个 SSL 证书。如需了解详情,请参阅负载平衡资源配额和限制中的目标池和目标代理

第 3 步:验证目标代理关联

创建或更新负载平衡器后,您可以确保 SSL 证书已与负载平衡器的目标代理关联。

如果您不知道目标代理的名称,请使用 gcloud compute target-https-proxies listgcloud compute target-ssl-proxies list 命令列出项目中的目标代理。

通过运行以下命令验证 SSL 证书与目标代理之间的关联。

对于外部 HTTPS 负载平衡器

gcloud compute target-https-proxies describe TARGET_HTTPS_PROXY_NAME \
    --global \
    --format="get(sslCertificates)"

对于 SSL 代理负载平衡器

gcloud compute target-ssl-proxies describe TARGET_SSL_PROXY_NAME \
    --format="get(sslCertificates)"

此时,您的 Google 管理的证书状态可能仍然为 PROVISIONING。Google Cloud 正与证书授权机构合作以颁发证书。预配 Google 管理的证书最多可能需要 60 分钟时间。

第 4 步:更新 DNS A 和 AAAA 记录以指向负载平衡器的 IP 地址

您的 DNS 记录可能会由注册商的网站、DNS 主机或 ISP 进行管理。管理 DNS 记录时,请务必为网域以及任何子网域添加或更新 DNS A 记录(适用于 IPv4)和 DNS AAAA 记录(适用于 IPv6)。

确保该记录使用 A/AAAA 记录指向与负载均衡器的一条或多条转发规则关联的 IP 地址。

如果您使用的是 Cloud DNSGoogle Domains,请设置您的域名更新您的域名服务器

如果您在 Google 管理的证书中有多个网域,请添加或更新所有网域和子网域的 DNS 记录。它们必须指向负载平衡器的 IP 地址。

如果满足以下条件,则代管式证书可以成功预配:

  • 您的网域的 DNS 记录使用指向其他网域的 CNAME 记录。
  • 另一个网域包含指向负载均衡器的 IP 地址的 A 或 AAAA 记录。

您可以通过运行 dig 命令来验证设置。例如,假设您的网域是 www.example.com。运行以下 dig 命令:

dig www.example.com
; <<>> DiG 9.10.6 <<>> www.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id:
;; flags: ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL:

;; PSEUDOSECTION:
; EDNS: version: 0, flags:; udp:
;; SECTION:
;www.example.com.

;; SECTION:
www.example.com.   example.net.
example.net.       34.95.64.10

;; time:
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: 16:54:44
;;  rcvd: 31748 qr rd 1 OPT 512 QUESTION IN A ANSWER 1742 IN CNAME 12 IN A Query 43 msec Wed Jun 03 PDT 2020 MSG SIZE 193>

在此示例中,34.95.64.10 是您的负载平衡器的 IP 地址。

互联网上的 DNS 解析器不受 Google Cloud 控制。它们根据存留时间 (TTL) 缓存资源记录集,这意味着 dignslookup 命令可能会返回缓存的值。如果您使用的是 Cloud DNS,请参阅传播更改

传播时间

新更新的 DNS A 和 AAAA 记录可能需要很长时间才能完全传播。有时,传播至整个互联网最长需要 72 小时,但通常需要几个小时。

重新运行以下命令:

gcloud compute ssl-certificates describe CERTIFICATE_NAME \
    --format="get(managed.domainStatus)"

如果您的网域状态为 FAILED_NOT_VISIBLE,可能是因为传播尚未完成。

如需了解详情,请参阅“问题排查”页面上的“Google 管理的 SSL 证书网域状态”部分

第 5 步:使用 OpenSSL 进行测试

证书和网域处于活跃状态后,您的负载平衡器最多可能需要 30 分钟才能开始使用 Google 管理的 SSL 证书。

如需进行测试,请运行以下 OpenSSL 命令,注意将 DOMAIN 替换为您的 DNS 名称,并将 IP_ADDRESS 替换为您的负载平衡器的 IP 地址。

echo | openssl s_client -showcerts -servername DOMAIN -connect IP_ADDRESS:443 -verify 99 -verify_return_error

此命令会输出负载平衡器提供给客户端的证书。输出应包含证书链和 Verify return code: 0 (ok) 以及其他详细信息。

Google 管理的 SSL 证书续订

Google Cloud 预配的代管式证书有效期为 90 天。证书到期前一个月左右,系统会自动开始续订证书。为此,系统选择了同时位于网域的证书授权机构授权 (CAA) DNS 记录中和证书授权机构列表中的证书授权机构 (CA)。

进行续订所用的证书授权机构可能并非颁发旧版 Google 管理的证书的证书授权机构。您可以控制 Google Cloud 用于续订的证书授权机构,方法是通过确保您的网域的 CAA DNS 记录从 Google 管理的证书使用的证书授权机构列表中指定一个证书授权机构。

如果托管证书中的任何网域或子网域未指向负载平衡器的 IP 地址,则续订过程将失败。为避免续订失败,请确保您的所有网域和子网域都指向负载平衡器的 IP 地址。

指定可颁发您的 Google 管理的证书的证书授权机构

在您的 DNS 软件中,我们建议您明确授权您要颁发 Google 管理的证书的证书授权机构。虽然并非在所有情况下都是必需的,但在某些情况下是必需的。

例如,如果您使用的是外部 DNS 服务并且 Google 管理的证书已撤消,则该服务可能仅验证由一个或多个特定 CA 颁发的新证书。

为此,请创建或修改 CAA 记录,使其包含 pki.goog 和/或 letsencrypt.org。如果您没有 CAA 记录,则默认行为是同时允许 pki.googletsencrypt.org

DOMAIN. CAA 0 issue "pki.goog"
DOMAIN. CAA 0 issue "letsencrypt.org"

letsencrypt.org 证书的支持是以尽力而为的方式提供的。为获得最高的可靠性,请同时允许 pki.googletsencrypt.org。如果您仅指定了一个证书授权机构,则只有该机构才会用于创建和续订您的证书。不建议使用此方法。

在您首次创建证书时,Google Cloud 会选择 pki.googletsencrypt.org,并使用它颁发您的证书。当 Google 续订您的证书时,证书可能会由另一个证书授权机构颁发,具体取决于您在 CAA 记录(如果您创建了记录)中指定的证书授权机构。在以下任一情况下,您的证书都可能由其他证书授权机构续订:

  • 您的网域没有 DNS CAA 记录。
  • 您已将两个证书授权机构都添加到了 DNS CAA 记录中。

如需了解详情,请参阅 RFC CAA DNS 记录

letsencrypt.org 会颁发国际化域名 (IDN)pki.goog 目前不支持 IDN。

如果您使用的是 Cloud DNS,请了解如何添加记录,并确保将 --type 标志设置为 CAA

可选步骤

本部分包含管理证书的可选步骤。

替换现有 SSL 证书

要替换现有 SSL 证书,请执行以下操作:

  1. 开始创建替代性 Google 管理的 SSL 证书的过程。此证书此时不会变为 ACTIVE。

  2. 更新目标代理,以使引用的证书列表包含替代性 SSL 证书以及当前的 SSL 证书。更新目标代理的步骤有所不同,如下所示:

  3. 等待替代性 SSL 证书完成预配过程。 配置最多可能需要 60 分钟。配置完成后,证书状态将变为 ACTIVE

  4. 请再等待 30 分钟,以确保替代性证书可供所有 Google Front End (GFE) 前端使用。

  5. 更新目标代理,以从引用的证书列表中移除要替换的 SSL 证书。更新目标代理的步骤有所不同,如下所示:

  6. 等待 10 分钟,并确认负载平衡器使用的是替代性 SSL 证书,而不是旧的 SSL 证书。

  7. 再次更新目标代理,移除旧的 SSL 证书资源。如果 SSL 证书资源不再被任何目标代理引用,则可以删除该资源

如果您不删除旧的 SSL 证书,则该证书在有效期结束前将保持 ACTIVE 状态。

从自行管理的 SSL 证书迁移到 Google 管理的 SSL 证书

将负载平衡器从使用自行管理的 SSL 证书迁移到 Google 管理的 SSL 证书时,您必须按以下顺序执行下列步骤:

  1. 创建 Google 管理的新证书
  2. 将 Google 管理的新证书与正确的目标代理相关联,同时保持目标代理与现有自行管理的证书的关联。
  3. 请等待 Google 管理的证书的状态变为 ACTIVE
  4. 等待 30 分钟,让新证书传播到提供服务的 Google Front End (GFE) 前端。
  5. 再次更新目标代理,移除自行管理的证书资源。如果自行管理的 SSL 证书资源不再被任何目标代理引用,则可以删除该资源

删除 SSL 证书

在删除 SSL 证书之前,请确保没有 HTTPS 或 SSL 目标代理引用此证书。可以通过以下两种方法实现此目的:

如需删除一个或多个 SSL 证书,请执行以下操作:

控制台

您可以在负载平衡页面的证书标签页上删除全局 SSL 证书。

  1. 转到 Google Cloud Console 中的“证书”页面。
    转到“证书”页面
  2. 选择要删除的 SSL 证书。
  3. 点击删除
  4. 再次点击删除进行确认。

gcloud

如需删除全球 SSL 证书(针对外部 HTTP(S) 负载平衡器或 SSL 代理负载平衡器),请使用带有 --global 标志的 gcloud compute ssl-certificates delete 命令:

gcloud compute ssl-certificates delete CERTIFICATE_NAME \
    --global

请将占位符替换为有效值:

  • CERTIFICATE_NAME:SSL 证书的名称

后续步骤

  • 如需对 SSL 证书进行问题排查,请参阅对 SSL 证书进行问题排查
  • 如需使用创建 Google 管理的证书的 Terraform 脚本,请参阅“外部 HTTP(S) 负载平衡器的 Terraform 模块示例”页面上的 Cloud Run 示例