使用 Google 管理的 SSL 证书

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

如需使用 Certificate Manager 创建 Google 管理的证书,请参阅部署概览

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

以下负载均衡器支持 Google 管理的证书:

  • 全球外部应用负载均衡器
  • 传统应用负载均衡器
  • 外部代理网络负载均衡器(使用目标 SSL 代理)

区域级外部应用负载均衡器、区域级内部应用负载均衡器或跨区域内部应用负载均衡器不支持 Compute Engine Google 管理的 SSL 证书。对于这些负载均衡器,您可以使用 Compute Engine 自行管理的 SSL 证书,也可以考虑改用 Certificate Manager

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

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

须知事项

权限

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

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

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

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

控制台

您可以在证书管理器页面的经典证书标签页上使用全局 SSL 证书。

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

gcloud

如需为全球外部应用负载均衡器或外部代理网络负载均衡器创建由 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:用于此证书的单个域名或英文逗号分隔的域名列表

Terraform

如需创建 Google 管理的 SSL 证书,请使用 google_compute_managed_ssl_certificate 资源。

resource "google_compute_managed_ssl_certificate" "lb_default" {
  provider = google-beta
  name     = "myservice-ssl-cert"

  managed {
    domains = ["example.com"]
  }
}

api

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

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

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

控制台

您可以在证书管理器页面的经典证书标签页上查看全局 SSL 证书的状态。

  1. 转到 Google Cloud 控制台中的经典证书标签页。
    转到“经典证书”标签页
  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 控制台更新全球外部应用负载平衡器或外部代理网络负载平衡器时, Google Cloud 会自动将您的 SSL 证书与正确的目标代理关联。

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

gcloud

如需将 SSL 证书与全球外部应用负载均衡器的目标 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 代理相关联,请使用 gcloud compute target-ssl-proxies update 命令:

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

请替换以下内容:

  • TARGET_PROXY_NAME:负载均衡器的目标代理名称
  • SSL_CERTIFICATE_LIST:英文逗号分隔的 SSL 证书资源列表

    确保引用的证书列表包含所有旧的有效 SSL 证书,以及新的 SSL 证书。gcloud compute target-ssl-proxies update 命令会使用新值替换 --ssl-certificates 的原始值。

Terraform

如需创建目标 HTTPS 代理,请使用 google_compute_target_https_proxy 资源。

如需创建目标 SSL 代理,请使用 google_compute_target_ssl_proxy 资源。

resource "google_compute_target_https_proxy" "lb_default" {
  provider = google-beta
  name     = "myservice-https-proxy"
  url_map  = google_compute_url_map.lb_default.id
  ssl_certificates = [
    google_compute_managed_ssl_certificate.lb_default.name
  ]
  depends_on = [
    google_compute_managed_ssl_certificate.lb_default
  ]
}

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

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

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

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

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

对于全球外部应用负载均衡器

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

对于外部代理网络负载均衡器

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 A 记录(对于 IPv4)和 DNS AAAA 记录(对于 IPv6)指向与负载均衡器的一条或多条转发规则关联的 IP 地址。

    如需预配 SSL 证书,请确保 A 和 AAAA 记录指向公共 DNS 中的负载均衡器 IP 地址。

  • 如果您使用的是 Cloud DNS,请设置您的网域更新您的域名服务器

  • 如果您在 Google 管理的证书中有多个网域,请添加或更新所有网域和子网域的 DNS 记录,以指向负载均衡器的 IP 地址。 如果 Google 管理的证书中的网域和子网域指向的 IP 地址与负载均衡器的转发规则 IP 地址不同,则证书验证会失败。

  • 确保您的 DNS 提供商对所有全球域名验证请求做出一致的响应。

如果满足以下条件,则托管证书会成功预配:

  • 您的网域的 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: 31748
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.example.com.           IN  A

;; ANSWER SECTION:
www.example.com. 1742    IN      CNAME   example.net.
example.net.      12     IN      A       34.95.64.10

;; Query time: 43 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Jun 03 16:54:44 PDT 2020
;; MSG SIZE  rcvd: 193

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

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

DNS 记录传播时间

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

重新运行以下命令:

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

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

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

多视角域名验证

Google Cloud 会定期续订您的 Google 管理的证书,并向证书授权机构 (CA) 请求证书。Google Cloud 用于续订证书的 CA 使用一种名为多视角签发验证 (MPIC) 的多视角域名验证方法。在此过程中,证书颁发机构会通过检查域名的 DNS 设置(在某些情况下,还会尝试与域名 IP 地址背后的服务器联系)来验证域名控制权。这些验证是从互联网上的多个 vantage 点进行的。如果验证流程失败,Google 管理的证书将无法续订。因此,负载平衡器会向客户端提供已过期的证书,导致浏览器用户遇到证书错误,API 客户端也遇到连接失败问题。

为防止配置错误的 DNS 记录出现多视角网域验证失败,请注意以下事项:

  • 您的网域和任何子网域的 DNS A 记录(IPv4)和 DNS AAAA 记录(IPv6)指向与负载平衡器的转发规则(一条或多条)关联的 IP 地址。如果记录中存在任何其他地址,都可能会导致验证失败。
  • 负责验证 DNS 记录的 CA 会从多个位置查询 DNS 记录。确保您的 DNS 提供商对所有全球域名验证请求做出一致的响应。
  • 使用 GeoDNS(根据请求位置返回不同的 IP 地址)或基于位置的 DNS 政策可能会导致响应不一致,并导致验证失败。如果您的 DNS 提供商使用 GeoDNS,请停用它,或者确保所有区域都返回相同的负载平衡器 IP 地址。
  • 您必须在 DNS 配置中明确指定负载平衡器的 IP 地址。 中间层(例如 CDN)可能会导致不可预测的行为。IP 地址需要可直接访问,请求路径中不得有任何重定向、防火墙或 CDN。如需了解详情,请参阅本文档中的CDN 后面的负载平衡器部分。
  • 建议您使用自己选择的 DNS 全球传播检查工具,验证所有相关 DNS 记录是否在全球范围内正确且一致地解析。

验证配置更改

配置 DNS 记录后,您可以通过创建新的证书并将其与现有证书一起连接到负载平衡器,来验证 DNS 记录是否正确。此步骤会强制向 CA 立即进行证书配置检查,以便您在几分钟内验证配置更改。如果没有此设置,现有证书的自动续期可能需要数天或数周时间,这会导致您的设置不确定。

如果证书状态变为 ACTIVE,则表示证书已颁发,这也证实您的 DNS 配置正确无误。目前,我们建议您移除之前的证书,以免为同一网域保留两个单独的证书。此过程不会中断流量到负载平衡器。

新证书可用作验证工具,其创建可确认使用 MPIC 进行的多视角域名验证是否适用于您的设置。

CDN 后面的负载平衡器

对于启用了 CDN 的负载平衡器,请求路径中的某些第三方 CDN 提供商可能会导致验证请求失败。如果 CDN 提供商正在主动代理 HTTP(S) 流量,则可能会发生这种情况。

在这种情况下,我们建议您将证书迁移到证书管理器,并使用 DNS 授权方法预配 Google 管理的证书。后一种方法不需要 CA 与您的负载平衡器联系。

第 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 管理的 SSL 证书可支持的网域数量有上限

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

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

为确保您的证书不会在续订流程的域名验证步骤中失败,请查看DNS A 和 AAAA 记录的要求

续订 Google 管理的 SSL 证书

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

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

为确保您的证书不会在续订流程的域名验证步骤中失败,请查看DNS A 和 AAAA 记录的要求

指定可颁发您的 Google 管理的证书的 CA

在您的 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 控制台中的经典证书标签页。
    转到“经典证书”标签页
  2. 选择要删除的 SSL 证书。
  3. 点击删除
  4. 再次点击删除进行确认。

gcloud

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

gcloud compute ssl-certificates delete CERTIFICATE_NAME \
    --global

请替换以下内容:

  • CERTIFICATE_NAME:SSL 证书的名称

后续步骤

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