如何在不停機的情況下遷移到 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 錯誤。

我發現的解決方法是使用自我管理證書在遷移過程中,一旦我們的網域指向 GCP 負載平衡器並且憑證已經頒發,就切換到 Google 託管憑證。

我用了讓我們加密證書,但其他也可以。這樣做的好處是我們已經在使用 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。您可以透過在主機檔案中新增 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更改PROVISIONINGACTIVE-任何其他狀態是一個應該調查的錯誤。 “配置 Google 管理的憑證可能需要長達 60 分鐘。”根據文件(讓我們加密在幾秒鐘內完成相同的事情......)。

負載平衡器可能還需要 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-management-certs

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

相關內容