使用使用者提供的憑證設定前端 mTLS

有效的用戶端憑證必須顯示信任鏈結,連回信任存放區中的信任錨點 (根憑證)。本頁面提供使用 OpenSSL 程式庫設定自己的根和中介憑證,藉此建立自己的信任鏈結的操作說明。

建立信任根之後,本文將概述將信任根上傳至憑證管理工具 TrustConfig 資源的信任存放區程序。接著,您可以將信任設定連結至用戶端驗證 (ServerTLSPolicy) 資源,然後將用戶端驗證資源附加至負載平衡器的目標 HTTPS Proxy 資源。

事前準備

  • 參閱相互傳輸層安全性總覽
  • 詳閱管理信任設定指南。
  • 安裝 Google Cloud CLI。如需工具的完整總覽,請參閱 gcloud CLI 總覽。您可以在 API 和 gcloud CLI 參考資料中找到與負載平衡相關的指令。

    如果您先前沒有執行過 gcloud CLI,請先執行 gcloud init 指令進行驗證。

  • 請啟用下列 API:Compute Engine API、Certificate Manager API、Network Security 和 Network Services API。詳情請參閱「啟用 API」。

  • 如果您使用全域外部應用程式負載平衡器或傳統版應用程式負載平衡器,請務必設定負載平衡器,並使用下列任何支援的後端:

    • VM 執行個體群組後端
    • Cloud Storage 值區 (僅支援與負載平衡器連結的後端服務,且該服務必須與後端值區一同連結)
    • Cloud Run、App Engine 或 Cloud Run functions
    • 混合式連線
    • Private Service Connect 後端
  • 如果您使用區域性外部應用程式負載平衡器、跨區域內部應用程式負載平衡器或區域內部應用程式負載平衡器,請務必設定負載平衡器,並使用下列任何支援的後端:

    • VM 執行個體群組後端
    • Cloud Run
    • 混合式連線
    • Private Service Connect 後端
  • 設定專案。

    gcloud

    gcloud config set project PROJECT_ID
    

權限

如要取得完成本指南所需的權限,請要求管理員為您授予專案的下列 IAM 角色:

  • 如要建立 TargetHTTPSProxy 等負載平衡器資源: Compute 負載平衡器管理員 (roles/compute.loadBalancerAdmin)
  • 如何使用 Certificate Manager 資源: Certificate Manager 擁有者 (roles/certificatemanager.owner)
  • 如要建立安全性和網路元件: Compute 網路管理員 (roles/compute.networkAdmin) 和 Compute 安全管理員 (roles/compute.securityAdmin)
  • 如要建立專案 (選用): 專案建立者 (roles/resourcemanager.projectCreator)

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

建立根憑證和中繼憑證

本節將使用 OpenSSL 程式庫建立根憑證 (信任錨點) 和中繼憑證。

根憑證位於憑證鏈的頂端。中繼憑證是信任鏈結的一部分,可連結至根憑證。中繼憑證由根憑證以加密方式簽署。負載平衡器收到用戶端憑證後,會透過建立從用戶端憑證回溯至已設定信任錨點的信任鏈結,驗證該憑證。

使用下列指令建立根憑證和中繼憑證。您可以選擇是否要建立中繼憑證。不過,在這個設定中,我們會使用中繼憑證簽署用戶端憑證

  1. 建立 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=clientAuth
    
    EOF
    
  2. 建立自行簽署的 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
    
  3. 為中繼憑證建立憑證簽署要求 (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
    
  4. 簽署 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
    

建立可新增至許可清單的自行簽署憑證

您可以建立自行簽署的憑證,並將其新增至信任設定中的許可清單

使用下列 OpenSSL 指令建立自行簽署的 X.509 憑證。

   openssl req -x509 \
       -new -sha256 -newkey rsa:2048 -nodes \
       -days 3650 -subj '/CN=localhost' \
       -keyout allowlisted.key -out allowlisted.cert

然後將這張憑證新增至信任設定中的 allowlistedCertificates 欄位

設定憑證格式

如要在 TrustStore 中加入新的或現有憑證,請將憑證格式化為單一行,並儲存在環境變數中,以便信任設定 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')

如要納入信任設定中許可清單新增的憑證,請將憑證格式化為單一行,並儲存在環境變數中,以便將其讀取至 YAML 檔案。如果是許可清單上的憑證,請使用下列指令將憑證格式化為單行,並儲存在 ALLOWLISTED_CERT 環境變數中。

export ALLOWLISTED_CERT=$(cat allowlisted.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')

建立信任設定資源

「信任設定」是 Certificate Manager 中的資源,代表您的公用金鑰基礎架構 (PKI) 設定。

如要建立信任設定資源,請完成下列步驟:

主控台

  1. 前往 Google Cloud 控制台的「Certificate Manager」頁面。

    前往 Certificate Manager

  2. 在「信任設定」分頁中,按一下「新增信任設定」

  3. 輸入設定名稱。

  4. 在「Location」(位置) 部分,選取「Global」(全域)或「Regional」(區域)

    位置代表信任設定資源的儲存位置。針對全域外部應用程式負載平衡器、傳統版應用程式負載平衡器和跨區域內部應用程式負載平衡器,請建立全域信任設定資源。如要建立區域性外部應用程式負載平衡器和區域性內部應用程式負載平衡器,請建立區域信任設定資源。

    如果您選取「Regional」(區域),請選取所需區域。

  5. 在「信任儲存庫」部分,按一下「新增信任錨點」,然後上傳 PEM 編碼憑證檔案,或複製憑證內容。

  6. 按一下「新增」。

  7. 在「信任存放區」部分,按一下「新增中繼 CA」,然後上傳 PEM 編碼憑證檔案,或複製憑證內容。

    這個步驟可讓您在根憑證和伺服器憑證之間新增另一層信任關係。

  8. 按一下「新增」,即可新增中繼 CA。

  9. 選用:在「許可清單憑證」部分中,按一下「新增憑證」,然後上傳 PEM 編碼憑證檔案,或複製憑證內容。

  10. 按一下「新增」,即可新增允許清單憑證。

  11. 按一下 [建立]。

確認新的信任設定資源是否顯示在設定清單中。

gcloud

  1. 建立指定信任設定參數的信任設定 YAML 檔案 (trust_config.yaml)。這個信任設定資源範例包含信任儲存庫,其中包含信任錨點和中繼憑證。這個函式會從先前「格式化憑證」步驟建立的環境變數中讀取憑證內容。

    cat << EOF > trust_config.yaml
    trustStores:
    - trustAnchors:
      - pemCertificate: "${ROOT_CERT?}"
      intermediateCas:
      - pemCertificate: "${INTERMEDIATE_CERT?}"
    EOF
    

    如要建立信任存放區,並加入其他信任錨點或中繼憑證,請在適當的部分新增 pemCertificate 列。

  2. 選用:指定要新增至信任設定 YAML 檔案的憑證,請在 allowlistedCertificates 欄位中指定。您不需要信任存放區,即可將憑證新增至許可清單。

    cat << EOF >> trust_config.yaml
    allowlistedCertificates:
    - pemCertificate: "${ALLOWLISTED_CERT?}"
    EOF
    

    加入許可清單的憑證代表任何可在信任設定中封裝的憑證,因此系統一律會將其視為有效。您可以使用 pemCertificate 欄位的多個例項,在許可清單中指定多個憑證。

  3. 如要匯入信任設定 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=LOCATION
    

    更改下列內容:

    • TRUST_CONFIG_NAME:信任設定資源的名稱。
    • LOCATION:信任設定資源的儲存區域。預設位置為 global

建立用戶端驗證資源

有了用戶端驗證 (也稱為 ServerTLSPolicy) 資源,您就能在驗證用戶端憑證時,指定要使用的伺服器端 TLS 模式和信任設定資源。如果用戶端向負載平衡器提供無效憑證或未提供憑證,clientValidationMode 會指定如何處理用戶端連線。詳情請參閱「mTLS 用戶端驗證模式」。

  • clientValidationMode 設為 ALLOW_INVALID_OR_MISSING_CLIENT_CERT 時,即使驗證失敗或缺少用戶端憑證,所有要求都會傳送至後端。
  • clientValidationMode 設為 REJECT_INVALID 時,只有提供可對 TrustConfig 資源驗證的用戶端憑證要求才會傳送至後端。

如要建立用戶端驗證 (ServerTlsPolicy) 資源,請完成下列步驟:

主控台

  1. 前往 Google Cloud 控制台的「Authentication Configuration」(驗證設定) 頁面。

    前往「驗證設定」

  2. 在「Client Authentication」分頁中,按一下「Create」

  3. 輸入用戶端驗證資源的名稱。

  4. 在「Location」(位置) 部分,選取「Global」(全域)或「Regional」(區域)

    針對全域外部應用程式負載平衡器、傳統版應用程式負載平衡器和跨區域內部應用程式負載平衡器,請將位置設為全域。如為區域性外部應用程式負載平衡器和區域性內部應用程式負載平衡器,請將位置設為負載平衡器的設定區域。

  5. 在「Client Authentication mode」(用戶端驗證模式) 中,選取「Load balancing」(負載平衡)

  6. 選取用戶端驗證模式。

  7. 選取先前建立的信任設定資源。

  8. 按一下 [建立]。

確認畫面上是否顯示「Client Authentication」(ServerTlsPolicy)。

gcloud

  1. 根據您要處理連線的方式,選取下列任一選項,以 YAML 格式定義用戶端驗證 (ServerTlsPolicy) 資源。

    • 選項 1: clientValidationMode 設為 ALLOW_INVALID_OR_MISSING_CLIENT_CERT

      全球

      針對全域外部應用程式負載平衡器、傳統版應用程式負載平衡器和跨區域內部應用程式負載平衡器,請建立 YAML 檔案,以宣告方式指定用戶端驗證模式和全域信任設定資源:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
          clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
          clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      區域

      針對區域性外部應用程式負載平衡器和區域性內部應用程式負載平衡器,請建立 YAML 檔案,以宣告方式指定用戶端驗證模式和區域信任設定資源:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
          clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
          clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      
    • 選項 2: clientValidationMode 設為 REJECT_INVALID

      全球

      針對全域外部應用程式負載平衡器、傳統版應用程式負載平衡器和跨區域內部應用程式負載平衡器,請建立 YAML 檔案,以宣告方式指定用戶端驗證模式和全域信任設定資源:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
          clientValidationMode: REJECT_INVALID
          clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      區域

      針對區域性外部應用程式負載平衡器和區域性內部應用程式負載平衡器,請建立 YAML 檔案,以宣告方式指定用戶端驗證模式和區域信任設定資源:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
            clientValidationMode: REJECT_INVALID
            clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      更改下列內容:

      SERVER_TLS_POLICY_NAME:用戶端驗證 (ServerTlsPolicy) 資源的名稱。

      PROJECT_ID: Google Cloud 專案的 ID。

      LOCATION:如果是全域外部應用程式負載平衡器、傳統版應用程式負載平衡器和跨區域內部應用程式負載平衡器,請使用 global。如果是區域性外部應用程式負載平衡器或區域性內部應用程式負載平衡器,請使用設定負載平衡器的區域。

      TRUST_CONFIG_NAME:先前建立的信任設定資源名稱。

  2. 如要匯入用戶端驗證 ServerTlsPolicy 資源,請使用 gcloud network-security server-tls-policies import 指令

    全球

    針對全域外部應用程式負載平衡器、傳統版應用程式負載平衡器和跨區域內部應用程式負載平衡器,請將 --location 標記設為 global

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=global
    

    更改下列內容:

    SERVER_TLS_POLICY_NAME:用戶端驗證 (ServerTlsPolicy) 資源的名稱。

    區域

    如要設定區域性外部應用程式負載平衡器和區域性內部應用程式負載平衡器,請將 --location 標記設為負載平衡器的所在區域。

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=LOCATION
    

    更改下列內容:

    SERVER_TLS_POLICY_NAME:用戶端驗證 (ServerTlsPolicy) 資源的名稱。

  3. 選用:如要列出所有用戶端驗證 (ServerTlsPolicies) 資源,請使用 gcloud network-security server-tls-policies list 指令

    gcloud network-security server-tls-policies list \
      --location=LOCATION
    

    更改下列內容:

    LOCATION:如果是全域外部應用程式負載平衡器、傳統版應用程式負載平衡器和跨區域內部應用程式負載平衡器,請使用 global。如果是區域性外部應用程式負載平衡器或區域性內部應用程式負載平衡器,請使用設定負載平衡器的區域。

將用戶端驗證資源連結至負載平衡器

為了讓雙向 TLS 驗證功能正常運作,您需要在設定負載平衡器後,將用戶端驗證 (ServerTLSPolicy) 資源附加至負載平衡器的目標 HTTPS Proxy 資源。

主控台

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡)頁面。

    前往「負載平衡」

  2. 從負載平衡器清單中,選取需要連結用戶端驗證 (ServerTLSPolicy) 資源的負載平衡器。

  3. 按一下「編輯」圖示

  4. 在 HTTPS 前端的「前端設定」部分,展開「顯示進階功能」部分。

  5. 從「Client Authentication」清單中選取「Client Authentication」資源。

  6. 按一下 [完成]

  7. 按一下 [Update]

gcloud

  1. 如要列出專案中的所有目標 HTTPS Proxy 資源,請使用 gcloud compute target-https-proxies list 指令

    gcloud compute target-https-proxies list
    

    請記下要附加 ServerTLSPolicy 資源的目標 HTTPS Proxy 名稱。這個名稱在後續步驟中稱為 TARGET_HTTPS_PROXY_NAME

  2. 如要將目標 HTTPS Proxy 的設定匯出至檔案,請使用 gcloud compute target-https-proxies export 指令

    全球

      gcloud compute target-https-proxies export TARGET_HTTPS_PROXY_NAME \
          --destination=TARGET_PROXY_FILENAME \
          --global
      

    更改下列內容:

    • TARGET_HTTPS_PROXY_NAME:目標 Proxy 的名稱。
    • TARGET_PROXY_FILENAME:目標 Proxy 的設定檔名稱,格式為 YAML。例如:mtls_target_proxy.yaml

    區域

    gcloud compute target-https-proxies export TARGET_HTTPS_PROXY_NAME \
        --destination=TARGET_PROXY_FILENAME \
        --region=REGION
    

    更改下列內容:

    • TARGET_HTTPS_PROXY_NAME:目標 Proxy 的名稱。
    • TARGET_PROXY_FILENAME:目標 Proxy 的設定檔名稱,格式為 YAML。例如:mtls_target_proxy.yaml
    • REGION:您設定負載平衡器的區域。
  3. 如要列出所有用戶端驗證 (ServerTlsPolicy) 資源,請使用 gcloud network-security server-tls-policies list 指令

    gcloud network-security server-tls-policies list \
        --location=LOCATION
    

    更改下列內容:

    LOCATION:如果是跨區域內部應用程式負載平衡器、全域外部應用程式負載平衡器或傳統版應用程式負載平衡器,請使用 global。如果是區域性外部應用程式負載平衡器或區域性內部應用程式負載平衡器,請使用設定負載平衡器的區域。

    請記下用來設定 mTLS 的用戶端驗證 (ServerTLSPolicy) 資源名稱。這個名稱在下一個步驟中稱為 SERVER_TLS_POLICY_NAME

  4. 將用戶端驗證 (ServerTlsPolicy) 附加至目標 HTTPS Proxy。

    echo "serverTlsPolicy: //networksecurity.googleapis.com/projects/PROJECT_ID/locations/LOCATION/serverTlsPolicies/SERVER_TLS_POLICY_NAME" >> TARGET_PROXY_FILENAME

    更改下列內容:

    • PROJECT_ID: Google Cloud 專案的 ID。
    • LOCATION:如果是全域外部應用程式負載平衡器或傳統應用程式負載平衡器,以及跨區域內部應用程式負載平衡器,請使用 global。如果是區域性外部應用程式負載平衡器或區域性內部應用程式負載平衡器,請使用設定負載平衡器的區域。
    • SERVER_TLS_POLICY_NAME:用戶端驗證 (ServerTLSPolicy) 資源的名稱。
    • TARGET_PROXY_FILENAME:目標 Proxy 的設定檔名稱,採用 YAML 格式。
  5. 如要從檔案匯入目標 HTTPS Proxy 的設定,請使用 gcloud compute target-https-proxies import 指令

    全球

      gcloud compute target-https-proxies import TARGET_HTTPS_PROXY_NAME \
          --source=TARGET_PROXY_FILENAME \
          --global
      

    更改下列內容:

    • TARGET_HTTPS_PROXY_NAME:目標 Proxy 的名稱。
    • TARGET_PROXY_FILENAME:目標 Proxy 的設定檔名稱,格式為 YAML。例如:mtls_target_proxy.yaml

    區域

      gcloud compute target-https-proxies import TARGET_HTTPS_PROXY_NAME \
          --source=TARGET_PROXY_FILENAME \
          --region=REGION
      

    更改下列內容:

    • TARGET_HTTPS_PROXY_NAME:目標 Proxy 的名稱。
    • TARGET_PROXY_FILENAME:目標 Proxy 的設定檔名稱,採用 YAML 格式。例如:mtls_target_proxy.yaml
    • REGION:您設定負載平衡器的區域。

新增 mTLS 自訂標頭

啟用 mTLS 後,您可以使用自訂標頭傳遞 mTLS 連線相關資訊。您也可以啟用記錄功能,以便在記錄中擷取 mTLS 連線失敗的資訊。

將 mTLS 自訂標頭新增至後端服務

針對全域外部應用程式負載平衡器或傳統應用程式負載平衡器,您可以使用 自訂標頭,將 mTLS 連線的相關資訊傳遞至後端服務

  1. 如要列出專案中的所有後端服務,請使用 gcloud compute backend-services list 指令

    gcloud compute backend-services list
    

    請記下要啟用自訂標頭和記錄的後端服務名稱。這個名稱在後續步驟中稱為 BACKEND_SERVICE

  2. 如要更新後端服務,請使用 gcloud compute backend-services update 指令

    gcloud compute backend-services update BACKEND_SERVICE \
      --global \
      --enable-logging \
      --logging-sample-rate=1 \
      --custom-request-header='X-Client-Cert-Present:{client_cert_present}' \
      --custom-request-header='X-Client-Cert-Chain-Verified:{client_cert_chain_verified}' \
      --custom-request-header='X-Client-Cert-Error:{client_cert_error}' \
      --custom-request-header='X-Client-Cert-Hash:{client_cert_sha256_fingerprint}' \
      --custom-request-header='X-Client-Cert-Serial-Number:{client_cert_serial_number}' \
      --custom-request-header='X-Client-Cert-SPIFFE:{client_cert_spiffe_id}' \
      --custom-request-header='X-Client-Cert-URI-SANs:{client_cert_uri_sans}' \
      --custom-request-header='X-Client-Cert-DNSName-SANs:{client_cert_dnsname_sans}' \
      --custom-request-header='X-Client-Cert-Valid-Not-Before:{client_cert_valid_not_before}' \
      --custom-request-header='X-Client-Cert-Valid-Not-After:{client_cert_valid_not_after}'
    

將 mTLS 自訂標頭新增至網址對應

如要使用跨區域內部應用程式負載平衡器、區域性外部應用程式負載平衡器或區域性內部應用程式負載平衡器,您可以使用 自訂標頭,將 mTLS 連線的相關資訊傳遞至 網址對應

如要列出專案中的所有網址對應,請使用 gcloud compute url-maps list 指令

   gcloud compute url-maps list
   

請記下網址對應的名稱,以便啟用自訂標頭和記錄功能。這個名稱在後續步驟中稱為 URL_MAP_NAME

全球

如要編輯跨區域內部應用程式負載平衡器的網址對應,請使用 gcloud compute url-maps edit 指令:

   gcloud compute url-maps edit URL_MAP_NAME --global
   

以下是 YAML 檔案範例,說明如何在自訂要求標頭 (requestHeadersToAdd) 中使用變數。您可以使用相同的變數傳送自訂回應標頭 (responseHeadersToAdd)。

   headerAction:
      requestHeadersToAdd:
      - headerName: "X-Client-Cert-Present"
        headerValue: "{client_cert_present}"
      - headerName: "X-Client-Cert-Chain-Verified"
        headerValue: "{client_cert_chain_verified}"
      - headerName: "X-Client-Cert-Error"
        headerValue: "{client_cert_error}"
      - headerName: "X-Client-Cert-Hash"
        headerValue: "{client_cert_sha256_fingerprint}"
      - headerName: "X-Client-Cert-Serial-Number"
        headerValue: "{client_cert_serial_number}"
      - headerName: "X-Client-Cert-SPIFFE"
        headerValue: "{client_cert_spiffe_id}"
      - headerName: "X-Client-Cert-URI-SANs"
        headerValue: "{client_cert_uri_sans}"
      - headerName: "X-Client-Cert-DNSName-SANs"
        headerValue: "{client_cert_dnsname_sans}"
      - headerName: "X-Client-Cert-Valid-Not-Before"
        headerValue: "{client_cert_valid_not_before}"
      - headerName: "X-Client-Cert-Valid-Not-After"
        headerValue: "{client_cert_valid_not_after}"
      - headerName: "X-Client-Cert-Issuer-Dn"
        headerValue: "{client_cert_issuer_dn}"
      - headerName: "X-Client-Cert-Subject-Dn"
        headerValue: "{client_cert_subject_dn}"
      - headerName: "X-Client-Cert-Leaf"
        headerValue: "{client_cert_leaf}"
      - headerName: "X-Client-Cert-Chain"
        headerValue: "{client_cert_chain}"
   

區域

如要編輯區域性外部應用程式負載平衡器或區域性內部應用程式負載平衡器的網址對應項目,請使用 gcloud compute url-maps edit 指令:

   gcloud compute url-maps edit URL_MAP_NAME --region=REGION
   

以下是 YAML 檔案範例,說明如何在自訂要求標頭 (requestHeadersToAdd) 中使用變數。您可以使用相同的變數傳送自訂回應標頭 (responseHeadersToAdd)。

   defaultService: regions/REGION/backendServices/BACKEND_SERVICE_1
      name: regional-lb-map
      region: region/REGION
   headerAction:
      requestHeadersToAdd:
      - headerName: "X-Client-Cert-Present"
        headerValue: "{client_cert_present}"
      - headerName: "X-Client-Cert-Chain-Verified"
        headerValue: "{client_cert_chain_verified}"
      - headerName: "X-Client-Cert-Error"
        headerValue: "{client_cert_error}"
      - headerName: "X-Client-Cert-Hash"
        headerValue: "{client_cert_sha256_fingerprint}"
      - headerName: "X-Client-Cert-Serial-Number"
        headerValue: "{client_cert_serial_number}"
      - headerName: "X-Client-Cert-SPIFFE"
        headerValue: "{client_cert_spiffe_id}"
      - headerName: "X-Client-Cert-URI-SANs"
        headerValue: "{client_cert_uri_sans}"
      - headerName: "X-Client-Cert-DNSName-SANs"
        headerValue: "{client_cert_dnsname_sans}"
      - headerName: "X-Client-Cert-Valid-Not-Before"
        headerValue: "{client_cert_valid_not_before}"
      - headerName: "X-Client-Cert-Valid-Not-After"
        headerValue: "{client_cert_valid_not_after}"
      - headerName: "X-Client-Cert-Issuer-Dn"
        headerValue: "{client_cert_issuer_dn}"
      - headerName: "X-Client-Cert-Subject-Dn"
        headerValue: "{client_cert_subject_dn}"
      - headerName: "X-Client-Cert-Leaf"
        headerValue: "{client_cert_leaf}"
      - headerName: "X-Client-Cert-Chain"
        headerValue: "{client_cert_chain}"
   

使用中繼憑證為用戶端憑證簽署

本節提供額外的設定選項,可用來產生用戶端 (葉節) 憑證。如果您已建立包含中繼憑證的 TrustConfig 資源,請執行下列操作:

  1. 建立設定檔,為用戶端憑證產生 CSR。

    下列設定檔 (client.config) 包含 [extension_requirements] 區段,可指定 CSR 中要納入的 X.509 額外資訊欄位。如要進一步瞭解用戶端憑證的相關規定,請參閱「憑證規定」。

    cat > client.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          = clientAuth
    
    [dn_requirements]
    countryName               = US
    stateOrProvinceName       = California
    localityName              = San Francisco
    0.organizationName        = example
    organizationalUnitName    = test
    commonName                = test.example.com
    emailAddress              = test@example.com
    
    EOF
    

    如要將 SPIFFE 身分附加至設定檔,請按照下列步驟操作:

    • subjectAltName 欄位新增至 [extension_requirements] 區段,如下所示:

      subjectAltName            = @sans_list
      
    • client.config 檔案底部新增一個區段 ([sans_list]),如下所示:

      [sans_list]
      URI.1                     = spiffe://example.com/test-identity
      
  2. 建立用戶端憑證的 CSR (client.csr)。

    openssl req -new \
        -config client.config \
        -keyout client.key -out client.csr
    
  3. 簽署 CSR 以核發 X.509 用戶端憑證 (client.cert)。CSR 是由中繼憑證簽署。

    openssl x509 -req \
        -CAkey int.key -CA int.cert \
        -days 365 \
        -extfile client.config \
        -extensions extension_requirements \
        -in client.csr -out client.cert
    
  4. 使用用戶端 SSL 憑證,將安全的 HTTPS 要求傳送至負載平衡器的 IP 位址。用戶端會提供憑證 (client.cert),向負載平衡器驗證自身。

    curl -v --key client.key --cert client.cert https://IP_ADDRESS
    

    IP_ADDRESS 替換為負載平衡器的 IP 位址。

後續步驟