設定後端 mTLS

本頁面提供使用全域外部應用程式負載平衡器的自行管理憑證,設定後端 mTLS 的操作說明。

設定後端 mTLS 的步驟與後端驗證的 TLS 類似,但您也需要為負載平衡器建立憑證。這個憑證也稱為用戶端憑證,會附加至後端驗證設定資源。負載平衡器會使用這個用戶端憑證,向後端驗證自身。

如要設定後端 mTLS,您必須執行下列操作:

  • 建立包含根憑證和中繼憑證的信任設定資源。
  • 建立用戶端憑證,然後上傳至憑證管理工具。
  • 建立同時參照信任設定和用戶端憑證的後端驗證設定資源。
  • 將後端驗證設定資源附加至負載平衡器的後端服務。

事前準備

  • 請參閱後端驗證的 TLS 和後端 mTLS 總覽
  • 參閱「管理信任設定」。
  • 如果您想按照本指南的操作說明使用 Google Cloud CLI,請先安裝該工具。您可以在 API 和 gcloud CLI 參考資料中找到與負載平衡相關的指令。

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

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

  • 使用下列任一支援的後端設定全域外部應用程式負載平衡器:

    • VM 執行個體群組後端
    • 混合式連線 NEG
    • 區域性 NEG

權限

本節列出設定後端 mTLS 所需的權限。
作業 權限
建立信任設定 目標 Google Cloud 專案的 certificatemanager.trustconfigs.create
建立用戶端憑證 目標 Google Cloud 專案的 certificatemanager.certs.create
建立後端驗證設定資源
  • 目標憑證上的 certificatemanager.certs.use
  • 目標信任設定的 certificatemanager.trustconfigs.use
  • 目標 Google Cloud 專案的 networksecurity.backendauthenticationconfigs.create
  • 將後端驗證設定資源附加至負載平衡器的後端服務
  • 目標後端服務上的 compute.backendservice.update
  • 目標後端驗證設定資源的 networksecurity.backendauthenticationconfigs.use
  • 設定總覽

    以下各節將說明如何根據下圖所示的架構,設定後端 mTLS:

    後端 mTLS 的元件。
    後端 mTLS 元件 (按一下可放大)。

    建立根憑證和中繼憑證

    本節將使用 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=serverAuth
      
      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. 為中繼憑證建立憑證簽署要求 (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
      
    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
      

    設定憑證格式

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

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

    主控台

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

      前往 Certificate Manager

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

    3. 輸入設定名稱。

    4. 在「位置」部分,選取「全域」。位置代表信任設定資源的儲存位置。針對全域外部應用程式負載平衡器,您需要建立全域信任設定資源。

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

    6. 按一下「新增」

    7. 在「信任存放區」部分,按一下「新增中繼 CA」,然後上傳 PEM 編碼憑證檔案,或複製憑證內容。這個步驟可讓您在根憑證和伺服器憑證之間新增另一層信任關係。

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

    9. 如要將新增的憑證加入許可清單,請按一下「新增」

    10. 點選「建立」

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

    gcloud

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

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

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

    2. 如要匯入信任設定 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:信任設定資源的名稱

    建立用戶端憑證

    在後端 mTLS 中,負載平衡器會扮演用戶端的角色,而後端則扮演伺服器的角色。

    如要啟用後端 mTLS,負載平衡器必須向後端證明自己的身分。這項驗證程序會使用負載平衡器向後端提供的用戶端憑證執行。後端伺服器需要使用自己的信任鏈結來驗證用戶端憑證。

    連線至後端伺服器時,負載平衡器會將伺服器名稱指示 (SNI) 設為 TLS 設定中指定的主機名稱。後端伺服器會根據這個 SNI 值選取適當的 SSL/TLS 憑證。負載平衡器會預期 SNI 值與後端伺服器憑證中列出的主體別名 (SAN) 相符。

    用戶端憑證可以是透過憑證授權單位服務從私人 CA 管理的憑證,也可以是自行管理的私人 PKI 憑證。在這個範例中,用戶端憑證是使用自行管理憑證核發。本節將使用 OpenSSL 程式庫建立根 CA 憑證和用戶端憑證。

    如要建立用戶端憑證,請完成下列步驟:

    1. 建立 OpenSSL 設定檔

      在以下範例中,設定檔 (example.cnf) 包含 [ca_exts] 區段,其中指定 X.509 擴充功能,將憑證標示為適合憑證授權單位 (CA) 使用。extendedKeyUsage 屬性已設為 clientAuth。如要進一步瞭解根憑證和中繼憑證的相關規定,請參閱「憑證規定」。

        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. 建立設定檔,為用戶端憑證產生 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
      
    4. 建立用戶端憑證的 CSR (client.csr)。

        openssl req -new \
            -config client.config \
            -keyout client.key -out client.csr
      
    5. 從 CSR 建立用戶端憑證 (client.cert)。CSR 是由根 CA 憑證簽署,用於核發 X.509 用戶端憑證。

        openssl x509 -req \
            -CAkey root.key -CA root.cert \
            -days 365 \
            -extfile client.config \
            -extensions extension_requirements \
            -in client.csr -out client.cert
      

    將用戶端憑證上傳至憑證管理工具

    如要將用戶端憑證上傳至憑證管理工具,請完成下列步驟:

    主控台

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

      前往 Certificate Manager

    2. 在「憑證」分頁中,按一下「新增憑證」

    3. 輸入憑證名稱。

      此名稱在專案中不得重複。

    4. 選用:輸入證書說明。方便日後識別特定憑證。

    5. 在「Location」(位置) 部分,選取「Global」

    6. 在「範圍」部分,選取「用戶端驗證」

    7. 在「憑證類型」部分,選擇「建立自行管理的憑證」

    8. 針對「Certificate」欄位,請上傳 PEM 編碼憑證檔案,或複製並貼上 PEM 編碼憑證的內容。

    9. 針對「私密金鑰憑證」欄位,請上傳未受密碼字串保護的 PEM 編碼私密金鑰,或複製並貼上 PEM 編碼私密金鑰的內容。

    10. 指定要與憑證建立關聯的標籤。您可以視需要新增多個標籤。如要新增標籤,請按一下「Add label」按鈕,然後為標籤指定 keyvalue

    11. 按一下「建立」,確認新憑證是否顯示在憑證清單中。

    gcloud

    1. 如要將用戶端憑證上傳至 Certificate Manager,請使用 gcloud certificate-manager certificates create 指令。此憑證的範圍為 client-auth,表示此憑證會用於後端 mTLS 中的用戶端憑證。

      gcloud certificate-manager certificates create CLIENT_ CERTIFICATE_NAME \
          --certificate-file=client.cert \
          --private-key-file=client.key \
          --scope=client-auth \
          --global
      

      更改下列內容:

      • CLIENT_CERTIFICATE_NAME:用戶端憑證資源的名稱。後端驗證設定資源會使用這個範圍為 client-auth 的用戶端憑證。

    建立後端驗證設定資源

    如要建立後端驗證設定 (BackendAuthenticationConfig) 資源,請完成下列步驟。

    主控台

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

      前往「驗證設定」

    2. 在「Backend Authentication」分頁中,按一下「Create」
    3. 輸入後端驗證設定資源的名稱。
    4. 選取先前建立的用戶端憑證資源。
    5. 選用步驟:選取公開信任根。
    6. 選取先前建立的信任設定資源。
    7. 點選「建立」

    確認畫面上是否顯示「Backend Authentication Config」資源。

    gcloud

    1. 建立 YAML 檔案,以宣告方式指定後端驗證設定資源的不同屬性。

      將用戶端憑證附加至後端驗證設定資源,即可啟用後端 mTLS。

      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
      clientCertificate: projects/PROJECT_ID/locations/global/certificates/CLIENT_ CERTIFICATE_NAME
      wellKnownRoots: PUBLIC_ROOTS
      EOF
      

      更改下列內容:

      • BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME :定義後端驗證設定資源的 YAML 檔案名稱。
      • PROJECT_ID: Google Cloud 專案的 ID
      • BACKEND_AUTH_CONFIG_NAME:後端驗證設定資源的名稱
      • TRUST_CONFIG_NAME:您先前建立的信任設定資源名稱。
      • CLIENT_CERTIFICATE_NAME:您先前建立的用戶端憑證資源名稱。
    2. 如要匯入後端驗證設定資源,請使用 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 檔案名稱。

    將後端驗證設定資源附加至負載平衡器的後端服務

    如要將後端驗證設定資源 (BackendAuthenticationConfig) 附加至負載平衡器的後端服務,請完成下列步驟。

    主控台

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

      前往「負載平衡」

    2. 在「Backends」分頁中,選取需要啟用後端驗證 TLS 和後端 mTLS 的後端服務。

    3. 按一下「編輯」圖示

    4. 展開「進階設定」部分。

    5. 在「後端驗證」部分中,選取「啟用」核取方塊。

    6. 選用:指定 SNI 主機名稱和接受的 SAN,驗證後端憑證

    7. 如要將後端驗證設定資源附加至後端服務,請在「後端驗證設定」清單中選取「後端驗證設定」資源。

    8. 按一下「繼續」

    9. 如要更新後端服務設定,請按一下「更新」

    gcloud

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

      gcloud compute backend-services list
      

      請記下要附加 BackendAuthenticationConfig 資源的後端服務名稱。這個名稱在後續步驟中稱為 BACKEND_SERVICE_NAME

    2. 如要將後端服務設定匯出至檔案,請使用 gcloud beta compute backend-services export 指令

      gcloud beta compute backend-services export BACKEND_SERVICE_NAME \
          --destination=BACKEND_SERVICE_FILENAME.yaml \
          --global
      

      更改下列內容:

      • BACKEND_SERVICE_NAME:後端服務名稱
      • BACKEND_SERVICE_FILENAME:匯出後端服務設定的 YAML 檔案名稱和路徑
    3. 更新後端服務的 tlsSettings 屬性,將其指向後端驗證設定資源。此外,您也可以在後端服務上設定 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
        

      上述 YAML 宣告中的 SNI 和 SAN 值僅供參考。您可以將這些值替換為與設定相關的實際值。

      更改下列內容:

      • BACKEND_SERVICE_FILENAME:匯出後端服務設定的 YAML 檔案名稱

      • PROJECT_ID: Google Cloud 專案的 ID

      • BACKEND_AUTH_CONFIG_NAME:後端驗證設定資源的名稱

    4. 如要從檔案匯入更新後的後端服務設定,請使用 gcloud beta compute backend-services import 指令

      gcloud beta compute backend-services import BACKEND_SERVICE_NAME \
          --source=BACKEND_SERVICE_FILENAME.yaml \
          --global
      

      更改下列內容:

      • BACKEND_SERVICE_NAME:後端服務名稱
      • BACKEND_SERVICE_FILENAME:後端服務設定 YAML 檔案的名稱

    建立後端伺服器憑證

    本節提供額外的設定選項,可建立由中繼憑證簽署的伺服器 (葉子) 憑證,該憑證是信任設定的一部分。這樣可確保從伺服器憑證建立信任鏈結,並連回信任錨點。

    如果您已建立包含中繼憑證的憑證信任設定資源,請執行下列操作:

    1. 建立設定檔,為伺服器憑證產生 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
      
    2. 為伺服器憑證建立 CSR (server.csr)。

      openssl req -new \
          -sha256 -newkey rsa:2048 -nodes \
          -config server.config \
          -keyout server.key -out server.csr
      
    3. 簽署 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 設定選項。

    1. 將伺服器私密金鑰 (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 編碼伺服器憑證。

    2. 將用戶端憑證上傳至伺服器的信任設定,以便驗證用戶端憑證。

            cat > client.cert << EOF
            -----BEGIN CERTIFICATE-----
            [...]
            -----END CERTIFICATE-----
            EOF
      
            sudo cp ./client.cert /etc/ssl/certs/client.cert
            

      [...] 替換為您先前建立的 PEM 編碼用戶端憑證。

    3. 更新 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
          ----
          

      更新 Apache 的 SSL 設定,要求用戶端憑證驗證,並指定 CA 憑證進行驗證。

          sudo vi /etc/apache2/sites-available/default-ssl.conf
      
          ----
          SSLVerifyClient require
          SSLVerifyDepth 5
          SSLCACertificateFile /etc/ssl/certs/client.cert
          ----
          
    4. 重新散列 CA 憑證。

          sudo c_rehash /etc/ssl/certs/
          
    5. 重新啟動 Apache 網路伺服器,套用變更。

          sudo systemctl restart apache2.service
          

    後續步驟