
我正在將 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 錯誤。
我發現的解決方法是使用自我管理證書在遷移過程中,一旦我們的網域指向 GCP 負載平衡器並且憑證已經頒發,就切換到 Google 託管憑證。
我用了讓我們加密證書,但其他也可以。這樣做的好處是我們已經在使用 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。您可以透過在主機檔案中新增 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 分鐘。”根據文件(讓我們加密在幾秒鐘內完成相同的事情......)。
負載平衡器可能還需要 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-management-certs
2 https://cloud.google.com/load-balancing/docs/ssl-certificates/google-management-certs#migrating-ssl