我正在将 example.com 从外部(非 Google)托管服务提供商移至 GCP。
在设置负载均衡器时,我注意到必须将 example.com 指向负载均衡器以便 Google 管理的证书能够验证。
我应该将 example.com 的 A 记录更改为新负载均衡器的(静态)IP - 然后它就会验证。
问题是我已经有大量流量到 example.com,在 example.com 开始指向负载均衡器之后但在证书验证之前发生的请求将产生 SSL 错误,并导致用户非常不满意。
有人解决了这个问题吗?我知道有办法避免停机旋转证书,但一定有某种方法可以在不停机的情况下迁移大型站点?
答案1
其他答案都很好,但我非常想找到一种方法来迁移到 GCP 负载均衡器,而无需计划停机时间,我们基本上只需坐着等待证书颁发。添加我自己的答案,因为这个问题得到了相当多的流量,事实证明,通过一些规划和测试,停机时间是不必要的。
以下是我的做法:
- 为 example.com 颁发临时 Let's Encrypt 证书。
- 将证书作为自我管理证书导入。
- 设置负载均衡器以使用自管理证书。
- 更新 DNS 记录以指向负载均衡器。
- 创建 Google 管理的证书并将其分配为第二证书,除自我管理证书外。
- 等待 Google 管理的证书
ACTIVE
。这可能需要很长时间。如果没有自我管理的证书,则会导致停机。 - 等待 30 分钟,让证书传播到所有 Google 前端 (GFE)。
- 现在已为负载均衡器分配了两个证书。将其更新为仅使用 Google 管理的证书。完成!
细节
问题总结:Google 的托管证书需要 DNS 记录指向已分配证书的负载平衡器,否则将无法颁发证书。这会产生问题,因为颁发证书可能需要长达一小时的时间,我们不希望在此期间出现 SSL 错误。
我发现的解决方法是使用自我管理证书在迁移和切换到 Google 管理证书的过程中,我们的域指向 GCP 负载均衡器,并且证书已经颁发。
我用了让我们加密证书,但其他证书也可以使用。这样做的好处是我们已经在使用 Let's Encrypt 证书,所以我不必担心证书兼容性。
这是我所做的简化版本。负载均衡器的目标代理将被称为my-target-proxy
,证书称为lb-certificate-letsencrypt
和lb-certificate-managed
。域名为example.com
和subdomain.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
等待status
从PROVISIONING
变为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 地址相关的潜在问题。迁移完成并关闭旧系统后,此类问题将开始出现。
请记住,DNS 资源记录是全局缓存的。资源记录 TTL 提供了缓存时间长度的提示。DNS 解析器可以自由使用其对 TTL 的解释。
记下您要更改的资源记录的 TTL。现在将 TTL 更改为较短的值,例如 1 分钟。
在进行最终更改之前,至少等待旧的 TTL 过期。
在进行任何 DNS 更改之前,请设置您的服务和负载均衡器。确保服务仅使用 IP 地址即可正常工作。如果您要将 IP 重定向到域,或将 HTTP 重定向到 HTTPS,请暂时禁用这些功能并稍后启用它们。
在手动模式下使用 certbot 并创建可加载到负载均衡器的证书。这样就省去了负载均衡器创建 SSL 证书并等待验证的步骤。您稍后可以切换到 Google 托管 SSL。
配置 Google Cloud Load Balancer HTTP 和 HTTPS 前端。在前端配置 Let's Encrypt SSL 证书。
计划在迁移后让旧网站运行大约 30 天。迁移后,我通常会在旧网站上看到几周的流量。
选择一天中流量最少的时间或一周中流量最少的一天。然后切换 DNS 资源记录。请记住,旧的 TTL 值应该已经过期,以便使用新的 TTL 进行缓存。
几天后,一旦你确认一切正常,将 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