CA プールを作成します

このページでは、認証局(CA)プールの作成方法について説明します。

CA プールは、共通の証明書発行ポリシーと Identity and Access Management(IAM)ポリシーを持つ複数の CA のコレクションです。CA プールを使用すると、CA ローテーション管理が容易になり、より高い有効な合計秒間クエリ数(QPS)を実現できます。

Certificate Authority Service を使用して CA を作成する前に、CA プールを作成する必要があります。 詳細については、CA プールの概要をご覧ください。

準備

CA Service オペレーション マネージャー(roles/privateca.caManager)の IAM ロールがあることを確認します。プリンシパルに IAM を付与する方法については、単一のロールを付与するをご覧ください。

CA プールの設定を決定する

このセクションでは、CA プールの設定について説明し、設定を決定するための推奨事項を示します。

永続的な CA プールの設定

次の CA プールの設定は、CA プールの作成後に変更できません。

ロケーション

CA プールのロケーションを指定します。CA プールは、単一の Google Cloud ロケーションに保存されます。CA プールは、同じロケーションまたは使用予定のロケーションの近くに作成することをおすすめします。

サポートされているロケーションの完全な一覧については、ロケーションをご覧ください。

ティア

DevOps または Enterprise ティアのどちらで CA プールを作成するかを選択します。この選択は、CA Service が作成した証明書を保持するかどうか、作成した証明書を後で取り消すことができるかどうか、および CA プール内の CA から証明書を作成できる最大レートに影響します。 詳細については、オペレーション階層を選択するをご覧ください。

オプションの CA プール設定

証明書発行ポリシー

CA プールには証明書発行ポリシーを設定できます。この発行ポリシーにより、CA プール内の CA が発行を許可されている証明書が制限されます。CA プールの発行ポリシーは、CA プールの作成後に更新できます。詳細については、テンプレートと発行ポリシーの概要をご覧ください。

証明書発行ポリシーの構成の詳細については、CA プールへの証明書発行ポリシーの追加をご覧ください。

公開オプション

各 CA の CA 証明書を公開するように CA プールを構成できます。 証明書を発行する場合、この CA 証明書の URL が、認証局情報アクセス(AIA)拡張機能として証明書に含まれます。

Enterprise ティアの CA プール内の CA は、関連付けられた Cloud Storage バケットに証明書失効リスト(CRL)を公開できます。証明書を発行する場合、この CRL の URL が、CRL 配布ポイント(CDP)拡張機能として証明書に含まれます。証明書に CDP 拡張機能がないと CRL を検出できません。詳細については、証明書を取り消すをご覧ください。

公開されている CA 証明書と CRL のエンコード形式を選択することもできます。サポートされているエンコード形式は Privacy Enhanced Mail(PEM)と Distinguished Encoding Rules(DER)です。エンコード形式が指定されていない場合、PEM が使用されます。

Google Cloud CLI または Google Cloud コンソールを使用して CA プールを作成すると、CA Service はデフォルトでこれらの公開オプションを有効にします。詳細については、CA プール内の CA の CA 証明書と CRL パブリケーションを無効にするをご覧ください。

CA プールを作成します

CA プールを作成するには、次の手順を行います。

コンソール

CA プールの名前を選択する

  1. Google Cloud コンソールの [Certificate Authority Service] ページに移動します。

    Certificate Authority Service に移動

  2. [CA プール マネージャー] をクリックします。

  3. [プールを作成] をクリックします。

  4. リージョンに固有の CA プールの名前を追加します。

  5. [リージョン] フィールドのプルダウンからリージョンを選択します。詳細については、最適なロケーションの選択をご覧ください。

  6. Enterprise ティアまたは DevOps ティアを選択します。詳細については、オペレーション階層を選択するをご覧ください。

  7. [次へ] をクリックします。

許可される鍵アルゴリズムとサイズを構成する

CA Service を使用すると、CA プール内の CA をサポートする Cloud KMS 鍵の署名アルゴリズムを選択できます。デフォルトでは、すべての鍵アルゴリズムが許可されます。

CA プールによって発行される証明書で許可される鍵を制限するには、次の手順を行います。これは省略可能な手順です。

  1. 切り替えボタンをクリックします。
  2. [項目を追加] をクリックします。
  3. [タイプ] リストで、鍵タイプを選択します。

    RSA 鍵を使用する場合は、次の手順を行います。

    1. 省略可: 最小モジュラス サイズをビット単位で追加します。
    2. 省略可: 最大モジュラス サイズをビット単位で追加します。
    3. [完了] をクリックします。

    楕円曲線鍵を使用する場合は、次の手順を行います。

    1. 省略可: [楕円曲線タイプ] リストで、楕円曲線タイプを選択します。
    2. [完了] をクリックします。
  4. 別の許可キーを追加するには、[項目を追加] をクリックし、手順 2 を繰り返します。

  5. [次へ] をクリックします。

証明書リクエスト メソッドを構成する

証明書のリクエスト元が CA プールの証明書をリクエストするために使用できるメソッドを制限するには、次の手順を行います。

  1. 省略可: CSR ベースの証明書リクエストを制限するには、切り替えボタンをクリックします。
  2. 省略可: 構成ベースの証明書リクエストを制限するには、切り替えボタンをクリックします。

パブリッシュ オプションを設定する

公開オプションを構成するには、次の手順を行います。

  1. 省略可: CA プール内の CA の Cloud Storage バケットへの CA 証明書の公開を禁止するには、切り替えボタンをクリックします。
  2. 省略可: CA プール内の CA の Cloud Storage バケットへの CRL の公開を禁止するには、切り替えボタンをクリックします。
  3. メニューをクリックして、公開された CA 証明書と CRL のエンコード形式を選択します。

    CA プール内の CA の CA 証明書と CRL の公開オプションを構成します。

  4. [次へ] をクリックします。

ID 制約を構成する

CA プールが発行する証明書のサブジェクトと SAN の制約を構成するには、次の手順を行います。

  1. 省略可: 証明書リクエストのサブジェクトが渡されないようにするには、切り替えボタンをクリックします。
  2. 省略可: 証明書リクエストのサブジェクト代替名が渡されないようにするには、切り替えボタンをクリックします。
  3. 省略可: Common Expression Language(CEL)式を追加して、証明書のサブジェクトを制限します。詳しくは、CEL の使用をご覧ください。
  4. [次へ] をクリックします。
拡張機能の制約を構成する

発行済み証明書に証明書リクエストからのすべての拡張機能を含めないようにするには、切り替えボタンをクリックします。

切り替えボタンをクリックすると、[既知の証明書拡張機能] フィールドが表示され、証明書の拡張機能を選択できます。証明書の拡張機能を選択するには、次の手順を行います。

  1. 省略可: [既知の証明書拡張機能] フィールドをクリックし、不要な拡張機能をメニューから削除します。
  2. 省略可: [カスタム拡張機能] フィールドに、CA プールが発行する証明書に含める拡張機能のオブジェクト識別子を追加します。
ベースライン値を構成する

CA プールから発行された証明書にベースライン値を構成するには、次の手順を行います。

  1. 切り替えボタンをクリックします。
  2. [ベースライン値を構成] をクリックします。
鍵の基本的用途を定義する

この設定を使用して、証明書に含まれる鍵の使用方法を構成できます。鍵の用途のオプションには、鍵の暗号化、データ暗号化、証明書署名、CRL 署名などがあります。

詳細については、鍵の用途をご覧ください。

鍵の基本的用途を定義するには、次の手順を行います。

  1. 省略可: 証明書に対する鍵の基本的用途を指定する場合は、表示されるウィンドウで切り替えボタンをクリックします。
  2. 鍵の使用方法のチェックボックスをオンにします。
  3. 鍵の使用方法の概要を選択します。
  4. [次へ] をクリックします。
鍵の拡張的用途を定義する

この設定を使用すると、証明書に含まれる鍵を使用できるさらに細かいシナリオを選択できます。オプションには、サーバー認証、クライアント認証、コード署名、メール保護などがあります。

鍵の拡張的用途は、オブジェクト識別子(OID)を使用して定義されます。鍵の拡張的用途を構成しない場合は、すべての鍵の使用シナリオが許可されます。

詳細については、鍵の拡張的用途をご覧ください。

鍵の拡張的用途を定義するには、次の手順を行います。

  1. 省略可: CA プールが発行する証明書に対する鍵の拡張的用途を指定するには、切り替えボタンをクリックします。
  2. 鍵の拡張的用途のシナリオのチェックボックスをオンにします。
  3. [次へ] をクリックします。
ポリシー識別子を定義する

証明書の証明書ポリシー拡張機能は、発行 CA のプールが従うポリシーを表します。この拡張機能には、証明書の発行前に ID を検証する方法、証明書を取り消す方法、CA プールの整合性の保証方法に関する情報を含めることができます。この拡張機能は、CA プールが発行する証明書を検証し、証明書がどのように使用されているかを確認するのに役立ちます。

詳細については、証明書ポリシーをご覧ください。

証明書の用途を定義するポリシーを指定するには、次の手順を行います。

  1. 省略可: [ポリシー識別子] フィールドにポリシー識別子を追加します。
  2. [次へ] をクリックします。
認証局情報アクセス(AIA)OCSP サーバーを追加する

証明書の AIA 拡張機能には次の情報が含まれます。

  • 証明書の取り消しステータスを確認できる OCSP サーバーのアドレス。
  • 証明書の発行者のアクセス方法。

詳しくは、認証局の情報アクセスをご覧ください。

証明書の AIA 拡張機能フィールドに表示される OCSP サーバーを追加するには、次の手順を行います。次の手順は省略可能です。

  1. 省略可: [項目を追加] をクリックします。
  2. [サーバー URL] フィールドに、OCSP サーバーの URL を追加します。
  3. [完了] をクリックします。
  4. [次へ] をクリックします。
追加の拡張機能を構成する

CA プールによって発行された証明書に含めるように追加のカスタム拡張機能を構成するには、次の手順を行います。次の手順は省略可能です。

  1. [項目を追加] をクリックします。
  2. [オブジェクト識別子] フィールドに、ドット区切りの形式の有効なオブジェクト識別子を追加します。
  3. [] フィールドに、識別子を base64 でエンコードした値を追加します。
  4. 拡張機能が重要な場合は、[重要な拡張機能] を選択します。

すべてのベースライン値の構成を保存するには、[完了] をクリックします。

CA プールを作成するには、[完了] をクリックします。

gcloud

次のコマンドを実行します。

gcloud privateca pools create POOL_NAME

POOL_NAME は、CA プールの名前に置き換えます。

CA プールに必要な階層を指定しない場合は、Enterprise ティアがデフォルトで選択されます。CA プールのティアを指定する場合は、次の gcloud コマンドを実行します。

gcloud privateca pools create POOL_NAME --tier=TIER_NAME

次のように置き換えます。

CA プールの公開エンコード形式を指定しない場合、PEM 公開エンコード形式がデフォルトで選択されます。CA プールの公開エンコード形式を指定する場合は、次の gcloud コマンドを実行します。

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

次のように置き換えます。

  • POOL_NAME: CA プールの名前。
  • PUBLISHING_ENCODING_FORMAT: PEM または DER

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 メソッドと URL:

    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 メソッドと URL:

    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 Service のリソースを整理する際に役立つ Key-Value ペアです。ラベルに基づいてリソースをフィルタリングできます。

CA プールのラベルを追加または更新するには、次の手順を行います。

コンソール

ラベルを追加するには、次の手順を行います。

  1. [Certificate Authority Service] ページに移動します。

    Certificate Authority Service に移動

  2. [CA プール マネージャー] タブで、CA プールを選択します。

  3. [ラベル] をクリックします。

  4. [ラベルを追加] をクリックします。

  5. Key-Value ペアを追加します。

  6. [保存] をクリックします。

    既存の CA プールにラベルを追加します。

既存のラベルを編集するには、次の手順を行います。

  1. [Certificate Authority Service] ページに移動します。

    Certificate Authority Service に移動

  2. [CA プール マネージャー] タブで、CA プールを選択します。

  3. [ラベル] をクリックします。

  4. ラベルの値を編集します。

  5. [保存] をクリックします。

gcloud

次のコマンドを実行します。

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

POOL_ID は、CA プールの名前に置き換えます。

次のステップ