建立憑證授權單位集區

本頁說明如何建立憑證授權單位 (CA) 集區。

CA 集區內含多個 CA,這些 CA 採用相同的憑證核發政策和 Identity and Access Management (IAM) 政策。CA 集區可簡化 CA 輪替管理作業,並讓您達到更高的每秒有效查詢總數 (QPS)。

您必須先建立 CA 集區,才能使用憑證授權單位服務建立 CA。 詳情請參閱「CA 集區總覽」。

事前準備

確認您具備 CA 服務營運管理員 (roles/privateca.caManager) IAM 角色。如要瞭解如何將 IAM 授予主體,請參閱「授予單一角色」。

決定 CA 集區的設定

本節說明 CA 集區的設定,並提供決定設定的建議。

永久憑證授權單位集區設定

建立 CA 集區後,就無法變更下列 CA 集區設定。

位置
指定 CA 集區的位置。CA 集區會儲存在單一Google Cloud 位置。建議您在打算使用 CA 集區的位置或附近建立 CA 集區。
如需支援位置的完整清單,請參閱「位置」一節。
級別
選擇要使用 DevOps 或 Enterprise 層級建立 CA 集區。這項選擇會影響 CA 服務是否會保留建立的憑證、建立的憑證是否可稍後撤銷,以及您可從 CA 集區中的 CA 建立憑證的最高速率。詳情請參閱「選取作業層級」。

選用的 CA 集區設定

憑證核發政策

CA 集區可以有憑證核發政策。這項核發政策會限制 CA 集區中的 CA 可核發的憑證。建立 CA 集區後,您可以更新 CA 集區的核發政策。詳情請參閱「範本和核發政策總覽」。

如要進一步瞭解如何設定憑證核發政策,請參閱將憑證核發政策新增至 CA 集區

發布選項

您可以設定 CA 集區,發布每個 CA 的 CA 憑證。核發憑證時,這個 CA 憑證的網址會以授權單位資訊存取權 (AIA) 擴充功能的形式納入憑證。

您可以允許 Enterprise 級別 CA 集區中的 CA,將憑證撤銷清單 (CRL) 發布至相關聯的 Cloud Storage bucket。核發憑證時,這個 CRL 的網址會以 CRL 發布點 (CDP) 擴充功能的形式,納入憑證中。如果憑證沒有 CDP 擴充功能,您就無法找到 CRL。詳情請參閱「撤銷憑證」。

您也可以選取發布的 CA 憑證和 CRL 的編碼格式。 支援的編碼格式為隱私強化郵件 (PEM) 和區別編碼規則 (DER)。如未指定編碼格式,系統會使用 PEM。

如果您使用 Google Cloud CLI 或 Google Cloud 控制台建立 CA 集區,CA 服務會預設啟用這些發布選項。詳情請參閱「停用 CA 集區中 CA 的 CA 憑證和 CRL 發布功能」。

客戶自行管理的加密金鑰 (CMEK)

根據預設,憑證授權單位服務會加密靜態儲存的客戶內容。CA Service 會為您處理加密作業,您不必採取其他動作。這項做法稱為「Google 預設加密」

如要控管加密金鑰,您可以在 Cloud KMS 中使用客戶自行管理的加密金鑰 (CMEK),搭配整合 CMEK 的服務 (包括 CA Service)。使用 Cloud KMS 金鑰可讓您控管保護等級、位置、輪替時間表、使用權限和存取權,以及加密範圍。 使用 Cloud KMS 還可追蹤金鑰用量、查看稽核記錄,以及控管金鑰生命週期。 您可以在 Cloud KMS 中控制及管理用來保護您資料的對稱金鑰加密金鑰 (KEK),而不是由 Google 擁有及管理。

使用 CMEK 設定 CA 集區後,存取 CA 服務 CA 集區的體驗與使用 Google 預設加密機制類似。如要進一步瞭解加密選項,請參閱「客戶自行管理的加密金鑰 (CMEK)」。

提供 EncryptionSpec 時,CA 服務會加密憑證主體、主體別名 (SAN) 和 PEM 編碼憑證或憑證簽署要求 (CSR) 等欄位。

下表列出使用 CMEK 加密的特定欄位:

類別 加密欄位
PEM 資料 pem_csr
pem_certificate
pem_certificate_chain
Subject config.subject_config.subject
certificate_description.subject_description.subject
主體替代名稱 config.subject_config.subject_alt_name
certificate_description.subject_description.subject_alt_name

如要使用 CMEK,您必須提供對稱式 Cloud KMS 金鑰的資源名稱,該金鑰必須與 CA 集區位於相同 Google Cloud 區域。

重要事項:

  • 配額影響:憑證核發作業會耗用主機專案的 Cloud KMS 配額。大量核發憑證可能會導致 Cloud Key Management Service 配額用量大幅增加。為避免這類用量影響其他服務,建議您使用專屬專案的 CMEK,隔離配額用量。
  • 延遲時間:CMEK 作業會增加憑證核發作業的延遲時間。如果是外部代管金鑰 (Cloud EKM),這種影響會更加明顯。
  • 可用性:相關聯的 CMEK 必須可用,且服務代理程式必須具備有效授權才能使用。如果無法存取金鑰 (例如停用、刪除或撤銷權限),需要解密的憑證核發和管理作業就會失敗。

如要進一步瞭解如何設定服務代理程式和權限,請參閱「CA Service Service Agent 角色」。

建立憑證授權單位集區

如要建立 CA 集區,請按照下列操作說明進行:

控制台

選擇 CA 集區的名稱

  1. 前往 Google Cloud 控制台的「Certificate Authority Service」(憑證授權單位服務) 頁面。

    前往憑證授權單位服務

  2. 按一下「CA pool manager」(CA 集區管理員)

  3. 按一下「建立集區」

  4. 為 CA 集區新增區域專屬名稱。

  5. 從「Region」(區域) 欄位的下拉式選單中選取區域。詳情請參閱選擇最佳位置

  6. 選取 Enterprise 或 DevOps 層級。詳情請參閱「選取作業層級」。

  7. 點選「下一步」

設定允許的金鑰演算法和大小

CA 服務可讓您為 CA 集區中 CA 的 Cloud KMS 金鑰選擇簽署演算法。根據預設,系統會允許所有金鑰演算法。

如要限制 CA 集區核發憑證中的可用金鑰,請按照下列步驟操作。這個步驟可以省略。

  1. 按一下切換鈕。
  2. 按一下「新增項目」
  3. 在「Type」(類型) 清單中,選取金鑰類型。

    如要使用 RSA 金鑰,請按照下列步驟操作:

    1. 選用:新增模數大小下限 (以位元為單位)。
    2. 選用:新增模數大小上限 (以位元為單位)。
    3. 按一下 [完成]

    如要使用橢圓曲線金鑰,請按照下列步驟操作:

    1. 選用:在「橢圓曲線類型」清單中,選取橢圓曲線類型。
    2. 按一下 [完成]
  4. 如要新增其他允許的金鑰,請按一下「新增項目」,然後重複步驟 2。

  5. 點選「下一步」

設定憑證要求方法

如要限制憑證要求者向 CA 集區要求憑證時可用的方法,請按照下列步驟操作:

  1. 選用:如要限制以 CSR 為基礎的憑證要求,請按一下切換按鈕。
  2. 選用:如要限制以設定為基礎的憑證要求,請按一下切換鈕。

設定發布選項

如要設定發布選項,請按照下列步驟操作:

  1. 選用:如要禁止將 CA 集區中 CA 的 CA 憑證發布至 Cloud Storage 值區,請點選切換鈕。
  2. 選用:如要禁止將 CA 集區中 CA 的 CRL 發布至 Cloud Storage bucket,請點選切換鈕。
  3. 按一下選單,選取已發布 CA 憑證和 CRL 的編碼格式。

    為 CA 集區中的 CA 設定 CA 憑證和 CRL 的發布選項。

  4. 點選「下一步」

定義基礎金鑰使用方式

這項設定是指數位憑證中的 Key Usage 欄位。這項擴充功能會指定憑證私密金鑰的使用方式,例如金鑰加密、資料加密、憑證簽署和 CRL 簽署。詳情請參閱「金鑰使用情形」。

  1. 如要選取基礎金鑰使用方式,請按一下「指定這個 CA 集區所核發憑證的基礎金鑰使用方式」切換鈕,然後從列出的選項中選取。
  2. 點選「下一步」
定義擴充金鑰使用方式

這項設定是指數位憑證中的 Extended Key Usage (EKU) 欄位。這項功能可針對金鑰的使用方式提供更具體且精細的限制,例如用於伺服器驗證、用戶端驗證、程式碼簽署和電子郵件保護。詳情請參閱「擴展金鑰用途」。

擴充金鑰使用方式是使用物件 ID (OID) 定義。如未設定擴充金鑰使用方式,系統會允許所有金鑰使用情境。

  1. 如要選取擴充金鑰使用方式,請按一下「針對從這個 CA 集區核發的憑證,寫入擴充金鑰使用方式」切換鈕,然後從列出的選項中選取。
  2. 點選「下一步」
定義政策 ID

憑證中的憑證政策擴充功能會說明核發 CA 集區遵循的政策。這項擴充功能可包含以下資訊:憑證核發前如何驗證身分、如何撤銷憑證,以及如何確保 CA 集區的完整性。這個擴充功能可協助您驗證 CA 集區核發的憑證,並查看憑證的使用方式。

詳情請參閱「憑證政策」。

如要指定定義憑證用途的政策,請按照下列步驟操作:

  1. 在「政策 ID」欄位中新增政策 ID。
  2. 按一下「下一步」
新增授權單位資訊存取權 (AIA) OCSP 伺服器

憑證中的 AIA 擴充功能會提供下列資訊:

  • OCSP 伺服器的位址,您可從這裡檢查憑證的撤銷狀態。
  • 憑證核發者的存取方法。

詳情請參閱「機構資訊存取權」。

如要新增憑證中 AIA 擴充欄位顯示的 OCSP 伺服器,請按照下列步驟操作:

  1. 按一下「新增項目」
  2. 在「伺服器網址」欄位中,新增 OCSP 伺服器的網址。
  3. 按一下[Done] (完成)
  4. 按一下「下一步」
CA 選項

憑證範本中的「CA 選項」欄位,定義了憑證授權單位 (CA) 階層中如何使用產生的憑證。CA 選項會決定憑證是否可用於簽署其他憑證,以及憑證核發的限制。

選擇下列任一選項:

  1. 加入設定來說明 CA X.509 的額外資訊欄位:在憑證範本中指定控制 X.509 擴充功能的設定。

  2. 將核發的憑證限制為僅適用於 CA:只有在選取上一個步驟中提及的核取方塊時,才會顯示這個選項。這個布林值表示憑證是否為 CA 憑證。如果設為 true,憑證可用於簽署其他憑證。如果 false,則憑證為終端實體憑證,無法簽署其他憑證。 按一下這個切換鈕後,系統會進一步提示您為 CA 憑證中的擴充功能定義名稱限制。

  3. 加入設定來說明 X.509 額外資訊欄位的路徑長度限制: 指定控制憑證鏈結長度的設定,該鏈結源自特定憑證。如果將頒發機構路徑長度上限設為 0,CA 就只能核發終端實體憑證。如果設為 1,這個 CA 憑證下方的鏈結只能包含一個從屬 CA。如未宣告值,則這個 CA 底下鏈結中的下層 CA 數量不受限制。

  4. 點選「下一步」
設定其他擴充功能

如要設定其他自訂擴充欄位,以便納入 CA 集區核發的憑證,請按照下列步驟操作:

  1. 按一下「新增項目」
  2. 在「物件 ID」欄位中,新增以半形句點分隔的數字,做為有效的物件 ID。
  3. 在「Value」(值) 欄位中,新增 ID 的 Base64 編碼值。
  4. 如果擴充功能至關重要,請選取「擴充功能至關重要」

如要儲存所有基準值設定,請按一下「完成」

如要建立 CA 集區,請按一下「完成」

gcloud

執行下列指令:

gcloud privateca pools create POOL_NAME --location=LOCATION

更改下列內容:

  • POOL_NAME:CA 集區的名稱。
  • LOCATION:要建立 CA 集區的位置。如需完整的位置清單,請參閱「位置」。

如果未指定 CA 集區所需的層級,系統會預設選取 Enterprise 層級。如要指定 CA 集區的層級,請執行下列 gcloud 指令:

gcloud privateca pools create POOL_NAME --location=LOCATION --tier=TIER_NAME

更改下列內容:

  • POOL_NAME:CA 集區的名稱。
  • LOCATION:要建立 CA 集區的位置。如需完整的位置清單,請參閱「位置」。
  • TIER_NAMEdevopsenterprise。詳情請參閱「選取作業層級」。

如未指定 CA 集區的發布編碼格式,系統會預設選取PEM發布編碼格式。如要為 CA 集區指定發布編碼格式,請執行下列 gcloud 指令:

gcloud privateca pools create POOL_NAME --location=LOCATION --publishing-encoding-format=PUBLISHING_ENCODING_FORMAT

更改下列內容:

  • POOL_NAME:CA 集區的名稱。
  • LOCATION:您要建立 CA 集區的位置。如需完整的位置清單,請參閱「位置」。
  • PUBLISHING_ENCODING_FORMATPEMDER

如要進一步瞭解 gcloud privateca pools create 指令,請參閱「gcloud privateca pools create」。

如要瞭解如何限制 CA 集區可核發的憑證類型,請參閱「為 CA 集區新增憑證核發政策」。

Terraform

resource "google_privateca_ca_pool" "default" {
  name     = "ca-pool"
  location = "us-central1"
  tier     = "ENTERPRISE"
  publishing_options {
    publish_ca_cert = true
    publish_crl     = true
  }
  labels = {
    foo = "bar"
  }
}

Go

如要向 CA Service 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。

import (
	"context"
	"fmt"
	"io"

	privateca "cloud.google.com/go/security/privateca/apiv1"
	"cloud.google.com/go/security/privateca/apiv1/privatecapb"
)

// Create a Certificate Authority pool. All certificates created under this CA pool will
// follow the same issuance policy, IAM policies, etc.
func createCaPool(w io.Writer, projectId string, location string, caPoolId string) error {
	// projectId := "your_project_id"
	// location := "us-central1"	// For a list of locations, see: https://cloud.google.com/certificate-authority-service/docs/locations.
	// caPoolId := "ca-pool-id"		// A unique id/name for the ca pool.

	ctx := context.Background()
	caClient, err := privateca.NewCertificateAuthorityClient(ctx)
	if err != nil {
		return fmt.Errorf("NewCertificateAuthorityClient creation failed: %w", err)
	}
	defer caClient.Close()

	caPool := &privatecapb.CaPool{
		// Set the tier (see: https://cloud.google.com/certificate-authority-service/docs/tiers).
		Tier: privatecapb.CaPool_ENTERPRISE,
	}

	locationPath := fmt.Sprintf("projects/%s/locations/%s", projectId, location)

	// See https://pkg.go.dev/cloud.google.com/go/security/privateca/apiv1/privatecapb#CreateCaPoolRequest.
	req := &privatecapb.CreateCaPoolRequest{
		Parent:   locationPath,
		CaPoolId: caPoolId,
		CaPool:   caPool,
	}

	op, err := caClient.CreateCaPool(ctx, req)
	if err != nil {
		return fmt.Errorf("CreateCaPool failed: %w", err)
	}

	if _, err = op.Wait(ctx); err != nil {
		return fmt.Errorf("CreateCaPool failed during wait: %w", err)
	}

	fmt.Fprintf(w, "CA Pool created")

	return nil
}

Java

如要向 CA Service 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。


import com.google.api.core.ApiFuture;
import com.google.cloud.security.privateca.v1.CaPool;
import com.google.cloud.security.privateca.v1.CaPool.IssuancePolicy;
import com.google.cloud.security.privateca.v1.CaPool.Tier;
import com.google.cloud.security.privateca.v1.CertificateAuthorityServiceClient;
import com.google.cloud.security.privateca.v1.CertificateIdentityConstraints;
import com.google.cloud.security.privateca.v1.CreateCaPoolRequest;
import com.google.cloud.security.privateca.v1.LocationName;
import com.google.longrunning.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class CreateCaPool {

  public static void main(String[] args)
      throws InterruptedException, ExecutionException, IOException {
    // TODO(developer): Replace these variables before running the sample.
    // location: For a list of locations, see:
    // https://cloud.google.com/certificate-authority-service/docs/locations
    // poolId: Set a unique poolId for the CA pool.
    String project = "your-project-id";
    String location = "ca-location";
    String poolId = "ca-pool-id";
    createCaPool(project, location, poolId);
  }

  // Create a Certificate Authority Pool. All certificates created under this CA pool will
  // follow the same issuance policy, IAM policies,etc.,
  public static void createCaPool(String project, String location, String poolId)
      throws InterruptedException, ExecutionException, IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `certificateAuthorityServiceClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (CertificateAuthorityServiceClient certificateAuthorityServiceClient =
        CertificateAuthorityServiceClient.create()) {

      IssuancePolicy issuancePolicy = IssuancePolicy.newBuilder()
          .setIdentityConstraints(CertificateIdentityConstraints.newBuilder()
              .setAllowSubjectPassthrough(true)
              .setAllowSubjectAltNamesPassthrough(true)
              .build())
          .build();

      /* Create the pool request
        Set Parent which denotes the project id and location.
        Set the Tier (see: https://cloud.google.com/certificate-authority-service/docs/tiers).
      */
      CreateCaPoolRequest caPoolRequest =
          CreateCaPoolRequest.newBuilder()
              .setParent(LocationName.of(project, location).toString())
              .setCaPoolId(poolId)
              .setCaPool(
                  CaPool.newBuilder()
                      .setIssuancePolicy(issuancePolicy)
                      .setTier(Tier.ENTERPRISE)
                      .build())
              .build();

      // Create the CA pool.
      ApiFuture<Operation> futureCall =
          certificateAuthorityServiceClient.createCaPoolCallable().futureCall(caPoolRequest);
      Operation response = futureCall.get();

      if (response.hasError()) {
        System.out.println("Error while creating CA pool !" + response.getError());
        return;
      }

      System.out.println("CA pool created successfully: " + poolId);
    }
  }
}

Python

如要向 CA Service 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。

import google.cloud.security.privateca_v1 as privateca_v1


def create_ca_pool(project_id: str, location: str, ca_pool_name: str) -> None:
    """
    Create a Certificate Authority pool. All certificates created under this CA pool will
    follow the same issuance policy, IAM policies,etc.,

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        location: location you want to use. For a list of locations, see: https://cloud.google.com/certificate-authority-service/docs/locations.
        ca_pool_name: a unique name for the ca pool.
    """

    caServiceClient = privateca_v1.CertificateAuthorityServiceClient()

    ca_pool = privateca_v1.CaPool(
        # Set the tier (see: https://cloud.google.com/certificate-authority-service/docs/tiers).
        tier=privateca_v1.CaPool.Tier.ENTERPRISE,
    )
    location_path = caServiceClient.common_location_path(project_id, location)

    # Create the pool request.
    request = privateca_v1.CreateCaPoolRequest(
        parent=location_path,
        ca_pool_id=ca_pool_name,
        ca_pool=ca_pool,
    )

    # Create the CA pool.
    operation = caServiceClient.create_ca_pool(request=request)

    print("Operation result:", operation.result())

REST API

  1. 建立 CA 集區。

    HTTP 方法和網址:

    POST https://privateca.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/caPools\?ca_pool_id=POOL_ID

    JSON 要求主體:

    {
      "tier": "ENTERPRISE"
    }
    

    請展開以下其中一個選項,以傳送要求:

    您應該會收到如下的 JSON 回覆:

    {
        "name": "projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID",
        "metadata": {...},
        "done": false
    }
    

  2. 輪詢作業,直到完成為止。

    當長時間執行的作業的 done 屬性設為 true 時,即代表作業完成。

    HTTP 方法和網址:

    GET https://privateca.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID

    請展開以下其中一個選項,以傳送要求:

    您應該會收到如下的 JSON 回覆:

    {
        "name": "projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID",
        "metadata": {...},
        "done": true,
        "response": {
          "@type": "type.googleapis.com/google.cloud.security.privateca.v1.CaPool",
          "name": "...",
          "tier": "ENTERPRISE"
        }
    }
    

在 CA 集區中新增或更新標籤

標籤是鍵/值組合,可協助您整理 CA 服務資源。您可以根據標籤篩選資源。

如要新增或更新 CA 集區的標籤,請按照下列步驟操作:

控制台

如要新增標籤,請按照下列步驟操作:

  1. 前往「Certificate Authority Service」(憑證授權單位服務) 頁面。

    前往憑證授權單位服務

  2. 在「CA pool manager」(CA 集區管理員) 分頁中,選取 CA 集區。

  3. 按一下 [標籤]

  4. 按一下「新增標籤」

  5. 新增鍵/值組合。

  6. 按一下 [儲存]

    為現有 CA 集區新增標籤。

如要編輯現有標籤,請按照下列步驟操作:

  1. 前往「Certificate Authority Service」(憑證授權單位服務) 頁面。

    前往憑證授權單位服務

  2. 在「CA pool manager」(CA 集區管理員) 分頁中,選取 CA 集區。

  3. 按一下 [標籤]

  4. 編輯標籤值。

  5. 按一下 [儲存]

gcloud

執行下列指令:

gcloud privateca pools update POOL_ID --location=LOCATION --update-labels foo=bar

更改下列內容:

  • POOL_ID:CA 集區的名稱。
  • LOCATION:CA 集區的位置。如需完整地點清單,請參閱「地點」。

後續步驟