本頁說明如何使用自行管理的憑證,設定後端驗證的 TLS (也稱為後端驗證)。
如要設定後端驗證的 TLS,請按照下列步驟操作。 本文後續章節將說明這些步驟。
- 建立信任設定資源,其中包含根憑證和中繼憑證。
- 建立後端驗證設定資源,並參照信任設定。
- 將後端驗證設定資源附加至負載平衡器的後端服務。
事前準備
- 請參閱後端驗證的 TLS 和後端 mTLS 總覽。
- 查看管理信任設定。
如要使用 Google Cloud CLI 按照本指南中的操作說明進行,請安裝該 CLI。您可以在 API 和 gcloud CLI 參考資料中找到與負載平衡相關的指令。
如果您之前沒有執行過 gcloud CLI,請先執行
gcloud init指令進行驗證。啟用下列 API:Compute Engine API、Certificate Manager API、Network Security 和 Network Services API。詳情請參閱「啟用 API」。
設定負載平衡器,並使用下列任一支援的後端:
- VM 執行個體群組後端
- 混合式連線 NEG
- 區域性 NEG
權限
本節列出設定後端驗證 TLS 所需的權限。| 作業 | 權限 |
|---|---|
| 建立信任設定 | 目標 Google Cloud 專案的 certificatemanager.trustconfigs.create 權限 |
| 建立後端驗證設定資源 |
certificatemanager.certs.usecertificatemanager.trustconfigs.usenetworksecurity.backendauthenticationconfigs.create專案的 Google Cloud 權限 |
| 將後端驗證設定資源附加至負載平衡器的後端服務 |
compute.backendservice.update 目標後端服務networksecurity.backendauthenticationconfigs.use |
設定總覽
以下各節將說明如何根據下圖所示架構,設定後端已驗證的 TLS。
建立根憑證和中繼憑證
本節使用 OpenSSL 程式庫建立根憑證 (信任錨點) 和中繼憑證。
根憑證位於憑證鏈的頂端,中繼憑證是信任鏈結的一部分,可追溯至根憑證。中繼憑證由根憑證以密碼編譯方式簽署。負載平衡器收到伺服器憑證時,會建立從伺服器憑證到已設定信任錨點的信任鏈,藉此驗證憑證。
使用下列指令建立根憑證和中繼憑證。
建立 OpenSSL 設定檔。
在下列範例中,設定檔 (
example.cnf) 包含[ca_exts]區段,其中指定了 X.509 擴充功能,可將憑證標示為適用於 CA。如要進一步瞭解根憑證和中繼憑證的規定,請參閱「憑證規定」。cat > example.cnf << EOF [req] distinguished_name = empty_distinguished_name [empty_distinguished_name] # Kept empty to allow setting via -subj command-line argument. [ca_exts] basicConstraints=critical,CA:TRUE keyUsage=keyCertSign extendedKeyUsage=serverAuth EOF建立自行簽署的 X.509 根憑證 (
root.cert)。根憑證會使用自己的私密金鑰 (root.key) 自行簽署。openssl req -x509 \ -new -sha256 -newkey rsa:2048 -nodes \ -days 3650 -subj '/CN=root' \ -config example.cnf \ -extensions ca_exts \ -keyout root.key -out root.cert建立中繼憑證的憑證簽署要求 (CSR)
int.req。openssl req -new \ -sha256 -newkey rsa:2048 -nodes \ -subj '/CN=int' \ -config example.cnf \ -extensions ca_exts \ -keyout int.key -out int.req簽署 CSR,建立 X.509 中繼憑證 (
int.cert)。CSR 是使用根憑證簽署。openssl x509 -req \ -CAkey root.key -CA root.cert \ -set_serial 1 \ -days 3650 \ -extfile example.cnf \ -extensions ca_exts \ -in int.req -out int.cert
設定憑證格式
如要在信任存放區中加入新憑證或現有憑證,請將憑證格式設為單行,並儲存在環境變數中,以便信任設定 YAML 檔案參照。
export ROOT_CERT=$(cat root.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
export INTERMEDIATE_CERT=$(cat int.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
建立信任設定
信任設定是 Certificate Manager 中的資源,代表您的公用金鑰基礎架構 (PKI) 設定。
如要建立信任設定資源,請完成下列步驟:
控制台
前往 Google Cloud 控制台的「Certificate Manager」頁面。
在「信任設定」分頁中,按一下「新增信任設定」。
輸入設定名稱。
在「位置」部分,選取「全域」或「區域」。
位置代表信任設定資源的儲存位置。如果是全域外部應用程式負載平衡器,請建立全域信任設定資源。如果是區域性外部應用程式負載平衡器和區域性內部應用程式負載平衡器,請建立區域信任設定資源。
在「信任儲存庫」部分中,按一下「新增信任錨點」,然後上傳 PEM 編碼憑證檔案,或複製憑證內容。
按一下「新增」。
在「信任存放區」部分中,按一下「新增中繼 CA」,然後上傳 PEM 編碼憑證檔案,或複製憑證內容。這個步驟可讓您在根憑證和伺服器憑證之間新增信任層級。
按一下「新增」,即可新增中繼 CA。
如要新增您加入允許清單的憑證,請按一下「新增」。
點選「建立」。
確認新的信任設定資源是否顯示在設定清單中。
gcloud
建立信任設定 YAML 檔案 (
trust_config.yaml),指定信任設定參數。這個範例信任設定資源包含信任儲存庫,以及信任錨點和中繼憑證。這個信任設定資源範例會從上一個「設定憑證格式」步驟中建立的環境變數讀取憑證內容。cat << EOF > trust_config.yaml trustStores: - trustAnchors: - pemCertificate: "${ROOT_CERT}" intermediateCas: - pemCertificate: "${INTERMEDIATE_CERT}" EOF如要使用其他信任錨點或中繼憑證建立信任儲存區,請在適當的區段中新增
pemCertificate列。如要匯入信任設定 YAML 檔案,請使用
gcloud certificate-manager trust-configs import指令。全球
如果是全域外部應用程式負載平衡器,請指定
global做為信任設定資源的儲存位置。gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME \ --source=trust_config.yaml \ --location=global將
TRUST_CONFIG_NAME替換為信任設定的名稱。區域
如果是區域性外部應用程式負載平衡器和區域性內部應用程式負載平衡器,請指定儲存信任設定資源的區域。
gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME \ --source=trust_config.yaml \ --location=REGION更改下列內容:
TRUST_CONFIG_NAME:信任設定資源的名稱REGION:儲存信任設定資源的區域
建立後端驗證設定資源
如要建立後端驗證設定 (BackendAuthenticationConfig) 資源,請完成下列步驟。
控制台
- 前往 Google Cloud 控制台的「Authentication Configuration」(驗證設定) 頁面。
- 在「Backend Authentication」(後端驗證) 分頁中,按一下「Create」(建立)。
- 輸入後端驗證設定資源的名稱。
- 在「位置」部分,選取「全域」或「區域」。
- 選用:選取公開信任根。
- 選取您先前建立的信任設定資源。
- 點選「建立」。
確認後端驗證設定資源是否顯示。
gcloud
建立 YAML 檔案,以宣告方式指定後端驗證設定資源的不同屬性。
全球
cat << EOF > BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME.yaml name: projects/PROJECT_ID/locations/global/backendAuthenticationConfigs/BACKEND_AUTH_CONFIG_NAME trustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME wellKnownRoots: PUBLIC_ROOTS EOF
更改下列內容:
BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME:定義後端驗證設定資源的 YAML 檔案名稱PROJECT_ID: Google Cloud 專案的 IDBACKEND_AUTH_CONFIG_NAME:後端驗證設定資源的名稱TRUST_CONFIG_NAME:您先前建立的信任設定資源名稱
區域
cat << EOF > BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME.yaml name: projects/PROJECT_ID/locations/REGION/backendAuthenticationConfigs/BACKEND_AUTH_CONFIG_NAME trustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME wellKnownRoots: PUBLIC_ROOTS EOF
更改下列內容:
BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME:定義後端驗證設定資源的 YAML 檔案名稱PROJECT_ID: Google Cloud 專案的 IDREGION:區域名稱BACKEND_AUTH_CONFIG_NAME:後端驗證設定資源的名稱TRUST_CONFIG_NAME:您先前建立的信任設定資源名稱
如要匯入後端驗證設定,請使用
gcloud network-security backend-authentication-configs import指令。全球
gcloud network-security backend-authentication-configs import BACKEND_AUTH_CONFIG_NAME \ --source=BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME.yaml \ --location=global更改下列內容:
BACKEND_AUTH_CONFIG_NAME:後端驗證設定資源的名稱BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME:定義後端驗證設定資源的 YAML 檔案名稱
區域
gcloud network-security backend-authentication-configs import BACKEND_AUTH_CONFIG_NAME \ --source=BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME.yaml \ --location=REGION更改下列內容:
BACKEND_AUTH_CONFIG_NAME:後端驗證設定資源的名稱BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME:定義後端驗證設定資源的 YAML 檔案名稱REGION:區域名稱
將後端驗證設定資源附加至負載平衡器的後端服務
如要將後端驗證設定 (BackendAuthenticationConfig 資源) 附加至負載平衡器的後端服務,請完成下列步驟。
控制台
前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
在「後端」分頁中,選取要啟用後端驗證 TLS 和後端 mTLS 的後端服務。
按一下「Edit」(編輯)。
展開「進階設定」部分。
在「Backend authentication」(後端驗證) 部分,選取「Enable」(啟用) 核取方塊。
選用:指定 SNI 主機名稱和接受的 SAN,以驗證後端憑證。
如要將後端驗證設定資源附加至後端服務,請在「後端驗證設定」清單中選取後端驗證設定資源。
按一下「繼續」。
如要更新後端服務設定,請按一下「更新」。
gcloud
如要列出專案中的所有後端服務資源,請使用
gcloud compute backend-services list指令。gcloud compute backend-services list
請記下要將
BackendAuthenticationConfig資源附加至的後端服務名稱。後續步驟會將這個名稱稱為BACKEND_SERVICE_NAME。如要將後端服務設定匯出至檔案,請使用
gcloud compute backend-services export指令。全球
gcloud compute backend-services export BACKEND_SERVICE_NAME \ --destination=BACKEND_SERVICE_FILENAME.yaml \ --global更改下列內容:
BACKEND_SERVICE_NAME:後端服務的名稱BACKEND_SERVICE_FILENAME:YAML 檔案的名稱和路徑,後端服務設定會匯出至該檔案
區域
gcloud compute backend-services export BACKEND_SERVICE_NAME \ --destination=BACKEND_SERVICE_FILENAME.yaml \ --region=REGION更改下列內容:
BACKEND_SERVICE_NAME:後端服務的名稱BACKEND_SERVICE_FILENAME:YAML 檔案的名稱和路徑,後端服務設定會匯出至該檔案REGION:後端服務所在的Google Cloud 區域名稱
更新後端服務的
tlsSettings屬性,將其指向後端驗證設定資源。此外,您可以在後端服務上設定 SNI 主機名稱和接受的 SAN,以驗證後端憑證。全球
將全域後端驗證設定資源附加至後端服務。
下列 YAML 宣告中的 SNI 和 SAN 值僅供參考。您可以將這些值替換為與設定相關的實際值。
cat << EOF >> BACKEND_SERVICE_FILENAME.yaml tlsSettings: authenticationConfig: //networksecurity.googleapis.com/projects/PROJECT_ID/locations/global/backendAuthenticationConfigs/BACKEND_AUTH_CONFIG_NAME sni: examplepetstore.com subjectAltNames: - dnsName: examplepetstore.com - dnsName: api.examplepetstore.com EOF更改下列內容:
BACKEND_SERVICE_FILENAME:匯出後端服務設定的 YAML 檔案名稱PROJECT_ID: Google Cloud 專案的 IDBACKEND_AUTH_CONFIG_NAME:後端驗證設定資源的名稱
區域
將區域後端驗證設定資源附加至後端服務。
下列 YAML 宣告中的 SNI 和 SAN 值僅供參考。您可以將這些值替換為與設定相關的實際值。
cat << EOF >> BACKEND_SERVICE_FILENAME.yaml tlsSettings: authenticationConfig: //networksecurity.googleapis.com/projects/PROJECT_ID/locations/REGION/backendAuthenticationConfigs/BACKEND_AUTH_CONFIG_NAME sni: examplepetstore.com subjectAltNames: - dnsName: examplepetstore.com - dnsName: api.examplepetstore.com EOF更改下列內容:
BACKEND_SERVICE_FILENAME:匯出後端服務設定的 YAML 檔案名稱PROJECT_ID: Google Cloud 專案的 IDREGION:建立後端驗證設定的Google Cloud 區域名稱BACKEND_AUTH_CONFIG_NAME:後端驗證設定資源的名稱
如要從檔案匯入更新後的後端服務設定,請使用
gcloud compute backend-services import指令。全球
gcloud compute backend-services import BACKEND_SERVICE_NAME \ --source=BACKEND_SERVICE_FILENAME.yaml \ --global更改下列內容:
BACKEND_SERVICE_NAME:後端服務的名稱BACKEND_SERVICE_FILENAME:後端服務設定 YAML 檔案的名稱
區域
gcloud compute backend-services import BACKEND_SERVICE_NAME \ --source=BACKEND_SERVICE_FILENAME.yaml \ --region=REGION更改下列內容:
BACKEND_SERVICE_NAME:後端服務的名稱BACKEND_SERVICE_FILENAME:後端服務設定 YAML 檔案的名稱REGION:後端服務所在的Google Cloud 區域名稱
建立後端伺服器憑證
本節提供額外的設定選項,可建立由中繼憑證簽署的伺服器 (葉) 憑證,這是信任設定的一部分。這可確保從伺服器憑證到信任錨點之間,可以建立信任鏈結。
如果您已建立包含中繼憑證的信任設定資源,請按照下列步驟操作:
建立設定檔,產生伺服器憑證的 CSR。
下列設定檔 (
server.config) 包含[extension_requirements]區段,用於指定要納入 CSR 的 X.509 擴充功能。如要進一步瞭解伺服器憑證的規定,請參閱「憑證規定」。cat > server.config << EOF [req] default_bits = 2048 req_extensions = extension_requirements distinguished_name = dn_requirements prompt = no [extension_requirements] basicConstraints = critical, CA:FALSE keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = examplepetstore.com DNS.2 = api.examplepetstore.com [dn_requirements] countryName = US stateOrProvinceName = California localityName = San Francisco 0.organizationName = example organizationalUnitName = test commonName = examplepetstore.com emailAddress = test@examplepetstore.com EOF建立伺服器憑證的 CSR (
server.csr)。openssl req -new \ -sha256 -newkey rsa:2048 -nodes \ -config server.config \ -keyout server.key -out server.csr簽署 CSR,核發 X.509 伺服器憑證 (
server.cert)。CSR 由中繼憑證簽署。openssl x509 -req \ -CAkey int.key -CA int.cert \ -days 365 \ -extfile server.config \ -extensions extension_requirements \ -in server.csr -out server.cert負載平衡器連線至後端伺服器時,後端伺服器會出示憑證 (
server.cert) 向負載平衡器驗證自身,完成後端驗證程序。
Apache 網路伺服器的其他 SSL 設定選項
這個選用章節會逐步說明如何根據先前建立的伺服器憑證,更新 Apache 伺服器上的 SSL 設定選項。-
將伺服器私密金鑰 (
server.key) 和伺服器憑證 (server.cert) 複製到 Apache 網路伺服器。cat > server.key << EOF -----BEGIN PRIVATE KEY----- [...] -----END PRIVATE KEY----- EOF sudo cp ./server.key /etc/ssl/private/server.key將
[...]替換為您先前建立的 PEM 編碼伺服器私密金鑰。cat > server.cert << EOF -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- EOF sudo cp ./server.cert /etc/ssl/certs/server.cert將
[...]替換為您先前建立的 PEM 編碼伺服器憑證。 -
更新 Apache 網路伺服器的 SSL 設定。
更新 Apache 的 SSL 設定,使用指定的 SSL 憑證和私密金鑰啟用 HTTPS 流量。
sudo vi /etc/apache2/sites-available/default-ssl.conf ---- SSLCertificateFile /etc/ssl/certs/server.cert SSLCertificateKeyFile /etc/ssl/private/server.key ---- -
重新雜湊 CA 憑證。
sudo c_rehash /etc/ssl/certs/ -
重新啟動 Apache 網路伺服器,即可套用變更。
sudo systemctl restart apache2.service