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 のエンコード形式を選択することもできます。サポートされているエンコード形式は、プライバシー強化メール(PEM)と識別符号化規則(DER)です。エンコード形式が指定されていない場合は、PEM が使用されます。

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

CA プールを作成します

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

Console

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. [次へ] をクリックします。

ベースライン値を構成する

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

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

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

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

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

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

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

拡張鍵の使用法は、オブジェクト ID(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. 高重要度な拡張機能である場合は、[高重要度な拡張機能] を選択します。

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

拡張機能の制約を構成する

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

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

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

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

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

証明書発行ポリシーで追加のパラメータを構成する方法については、IssuancePolicy をご覧ください。

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 プールのラベルを追加または更新するには、次の手順を行います。

Console

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

  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 プールの名前に置き換えます。

次のステップ