如何在不停机的情况下迁移到 Google 管理的证书?

如何在不停机的情况下迁移到 Google 管理的证书?

我正在将 example.com 从外部(非 Google)托管服务提供商移至 GCP。

在设置负载均衡器时,我注意到必须将 example.com 指向负载均衡器以便 Google 管理的证书能够验证。

我应该将 example.com 的 A 记录更改为新负载均衡器的(静态)IP - 然后它就会验证。

问题是我已经有大量流量到 example.com,在 example.com 开始指向负载均衡器之后但在证书验证之前发生的请求将产生 SSL 错误,并导致用户非常不满意。

有人解决了这个问题吗?我知道有办法避免停机旋转证书,但一定有某种方法可以在不停机的情况下迁移大型站点?

答案1

其他答案都很好,但我非常想找到一种方法来迁移到 GCP 负载均衡器,而无需计划停机时间,我们基本上只需坐着等待证书颁发。添加我自己的答案,因为这个问题得到了相当多的流量,事实证明,通过一些规划和测试,停机时间是不必要的。

以下是我的做法:

  1. 为 example.com 颁发临时 Let's Encrypt 证书。
  2. 将证书作为自我管理证书导入。
  3. 设置负载均衡器以使用自管理证书。
  4. 更新 DNS 记录以指向负载均衡器。
  5. 创建 Google 管理的证书并将其分配为第二证书,除自我管理证书外。
  6. 等待 Google 管理的证书ACTIVE。这可能需要很长时间。如果没有自我管理的证书,则会导致停机。
  7. 等待 30 分钟,让证书传播到所有 Google 前端 (GFE)。
  8. 现在已为负载均衡器分配了两个证书。将其更新为仅使用 Google 管理的证书。完成!

细节

问题总结:Google 的托管证书需要 DNS 记录指向已分配证书的负载平衡器,否则将无法颁发证书。这会产生问题,因为颁发证书可能需要长达一小时的时间,我们不希望在此期间出现 SSL 错误。

我发现的解决方法是使用自我管理证书在迁移和切换到 Google 管理证书的过程中,我们的域指向 GCP 负载均衡器,并且证书已经颁发。

我用了让我们加密证书,但其他证书也可以使用。这样做的好处是我们已经在使用 Let's Encrypt 证书,所以我不必担心证书兼容性

这是我所做的简化版本。负载均衡器的目标代理将被称为my-target-proxy,证书称为lb-certificate-letsencryptlb-certificate-managed。域名为example.comsubdomain.example.com

先决条件:

生成一个由 Let's Encrypt 签名的新证书作为自管理证书:

openssl genrsa -out letsencrypt.pem 2048

创建 openssl 配置文件:

openssl.conf

[req]
default_bits              = 2048
req_extensions            = extension_requirements
distinguished_name        = dn_requirements

[extension_requirements]
basicConstraints          = CA:FALSE
keyUsage                  = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName            = @sans_list

[dn_requirements]
countryName               = Country Name (2 letter code)
stateOrProvinceName       = State or Province Name (full name)
localityName              = Locality Name (eg, city)
0.organizationName        = Organization Name (eg, company)
organizationalUnitName    = Organizational Unit Name (eg, section)
commonName                = Common Name (e.g. server FQDN or YOUR name)
emailAddress              = Email Address

[sans_list]
DNS.1                     = example.com
DNS.2                     = subdomain.example.com

生成证书签名请求

openssl req -new -key letsencrypt.pem -out letsencrypt.csr -config openssl.conf

从 Let's Encrypt 获取签名的证书:

certbot certonly --csr letsencrypt.csr --manual --preferred-challenges dns

更新 certbot 指示的 DNS 记录以验证所有权。其他挑战可能也有效,但 DNS 似乎最简单。

记下哪个文件是完整的证书链,并0003_chain.pem在必要时在示例中进行替换:

完整证书链保存在:...

在 GCP 中上传并创建自管理证书:

gcloud compute ssl-certificates create lb-certificate-letsencrypt \
  --certificate=0003_chain.pem \
  --private-key=letsencrypt.pem \
  --global

创建您要迁移到的负载均衡器,或将其配置为使用自我管理证书:

gcloud beta compute target-https-proxies create my-target-proxy \
  --ssl-certificates=lb-certificate-letsencrypt [url-map and other options]
# Or
gcloud beta compute target-https-proxies update my-target-proxy \
  --ssl-certificates=lb-certificate-letsencrypt

更新 DNS 记录以指向负载均衡器的 IP。现在它应该能够终止 example.com 和 subdomain.example.com 的 TLS。您可以通过在 hosts 文件中添加 example.com 的记录来测试此步骤,指向负载均衡器的 IP。John Hanley 的回答对此给出了很多很好的建议。

创建托管证书:

gcloud compute ssl-certificates create lb-certificate-managed \
  --domains=example.com,subdomain.example.com \
  --global

Google 管理的证书不支持通配符,因此请确保列出所有正在使用的域。

将其分配给目标代理一起使用自我管理证书。在将证书分配给代理之前,不会对其进行配置:

gcloud beta compute target-https-proxies update my-target-proxy \
  --ssl-certificates=lb-certificate-letsencrypt,lb-certificate-managed

检查状态:

gcloud compute ssl-certificates describe lb-certificate-managed

等待statusPROVISIONING变为ACTIVE-任何其他状态是一个需要调查的错误。“配置 Google 管理的证书可能需要长达 60 分钟。”根据文档(Let's Encrypt 在几秒钟内完成同样的事情...)。

负载均衡器可能还需要 30 分钟才能使用。

所以,等待30分钟状态变为 后ACTIVE

更新目标代理以仅使用 Google 管理的证书:

gcloud beta compute target-https-proxies update my-target-proxy \
  --ssl-certificates=lb-certificate-managed

新设置可能需要一段时间才能生效。在浏览器中或使用 openssl 验证端点的颁发者:

openssl s_client -connect example.com:443 -showcerts \
  -CAfile /etc/ssl/certs/ca-certificates.crt <<< Q

发行者现在应该是“Google Trust Services LLC”,而不是“Let's Encrypt”。

现在可以删除自我管理的 Let's Encrypt 证书,或者将其保留直至过期,以防管理证书出现任何问题。

要清理未使用的自管理 Let's Encrypt 证书,请运行:

gcloud compute ssl-certificates delete lb-certificate-letsencrypt

答案2

您将会有一些停机时间。

您可以遵循这些提示来最大限度地减少停机时间。通过适当的规划,停机时间将非常短,在某些情况下,自动重试将使客户端看不到这一点。

但是,我不知道您的网站设计、cookie 的使用、身份验证、会话管理等。可能会出现不可避免的中断。如果可能的话,请考虑向您的客户发送电子邮件,提前告知他们网站维护事宜。

现在是检查日志的好时机。查找与访问 IP 地址相关的潜在问题。迁移完成并关闭旧系统后,此类问题将开始出现。

  1. 请记住,DNS 资源记录是全局缓存的。资源记录 TTL 提供了缓存时间长度的提示。DNS 解析器可以自由使用其对 TTL 的解释。

  2. 记下您要更改的资源记录的 TTL。现在将 TTL 更改为较短的值,例如 1 分钟。

  3. 在进行最终更改之前,至少等待旧的 TTL 过期。

  4. 在进行任何 DNS 更改之前,请设置您的服务和负载均衡器。确保服务仅使用 IP 地址即可正常工作。如果您要将 IP 重定向到域,或将 HTTP 重定向到 HTTPS,请暂时禁用这些功能并稍后启用它们。

  5. 在手动模式下使用 certbot 并创建可加载到负载均衡器的证书。这样就省去了负载均衡器创建 SSL 证书并等待验证的步骤。您稍后可以切换到 Google 托管 SSL。

  6. 配置 Google Cloud Load Balancer HTTP 和 HTTPS 前端。在前端配置 Let's Encrypt SSL 证书。

  7. 计划在迁移后让旧网站运行大约 30 天。迁移后,我通常会在旧网站上看到几周的流量。

  8. 选择一天中流量最少的时间或一周中流量最少的一天。然后切换 DNS 资源记录。请记住,旧的 TTL 值应该已经过期,以便使用新的 TTL 进行缓存。

  9. 几天后,一旦你确认一切正常,将 TTL 值设置为正常值,例如604800即一周内的秒数或 86400(一天)。重新启用站点重定向(IP -> 域,HTTP -> HTTPS)(如果使用)。

答案3

除了上述建议外,请记住,区域外部 HTTP(S) 负载均衡器和内部 HTTP(S) 负载均衡器不支持 Google 管理的 SSL 证书。对于这些负载均衡器,您需要使用自我管理的 SSL 证书。我还没有看到您使用的负载均衡器类型,但在尝试设置此迁移之前,您需要考虑它。此外,在同一个指导您可以了解如何创建和使用 Google 管理的 SSL 证书,以及使其正常运行的注意事项1

我建议您为这些更改设置一个维护窗口,因为可能需要长达 30 分钟的时间才能将证书提供给所有 Google 前端 (GFE)。

此外,在这里 您将看到官方指南,逐步指导如何实现此行为。

1 https://cloud.google.com/load-balancing/docs/ssl-certificates/google-managed-certs

2 https://cloud.google.com/load-balancing/docs/ssl-certificates/google-managed-certs#migrating-ssl

相关内容