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

And*_*zlo 7 load-balancing ssl-certificate google-compute-engine google-cloud-platform

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

设置负载均衡器时,我注意到我必须将 example.com 指向负载均衡器才能验证 Google 托管证书。

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

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

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

And*_*zlo 5

其他答案都非常好,但我非常有动力找到一种迁移到 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 错误。

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

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

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

先决条件:

生成一个新证书用作自我管理证书,由 Let's Encrypt 签名:

openssl genrsa -out letsencrypt.pem 2048
Run Code Online (Sandbox Code Playgroud)

创建 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
Run Code Online (Sandbox Code Playgroud)

生成证书签名请求

openssl req -new -key letsencrypt.pem -out letsencrypt.csr -config openssl.conf
Run Code Online (Sandbox Code Playgroud)

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

certbot certonly --csr letsencrypt.csr --manual --preferred-challenges dns
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

gcloud compute ssl-certificates create lb-certificate-letsencrypt \
  --certificate=0003_chain.pem \
  --private-key=letsencrypt.pem \
  --global
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

更新 DNS 记录以指向负载均衡器的 IP。现在应该能够终止 example.com 和 subdomain.example.com 的 TLS。您可以通过在主机文件中添加 example.com 的记录来测试此步骤,该记录指向负载均衡器 IP。约翰·汉利(John Hanley)的回答对此提供了很多好的建议。

创建托管证书:

gcloud compute ssl-certificates create lb-certificate-managed \
  --domains=example.com,subdomain.example.com \
  --global
Run Code Online (Sandbox Code Playgroud)

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

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

gcloud beta compute target-https-proxies update my-target-proxy \
  --ssl-certificates=lb-certificate-letsencrypt,lb-certificate-managed
Run Code Online (Sandbox Code Playgroud)

检查状态:

gcloud compute ssl-certificates describe lb-certificate-managed
Run Code Online (Sandbox Code Playgroud)

等到从status更改为PROVISIONING-ACTIVE任何其他状态都是错误,应进行调查。“配置 Google 管理的证书最多可能需要 60 分钟。” 根据文档(让我们加密在几秒钟内完成同样的事情......)。

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

因此,请在状态变为 后等待 30 分钟ACTIVE

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

gcloud beta compute target-https-proxies update my-target-proxy \
  --ssl-certificates=lb-certificate-managed
Run Code Online (Sandbox Code Playgroud)

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

openssl s_client -connect example.com:443 -showcerts \
  -CAfile /etc/ssl/certs/ca-certificates.crt <<< Q
Run Code Online (Sandbox Code Playgroud)

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

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

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

gcloud compute ssl-certificates delete lb-certificate-letsencrypt
Run Code Online (Sandbox Code Playgroud)