証明書テンプレートを作成する

このページでは、証明書テンプレートの属性と、証明書テンプレートの作成方法について説明します。

証明書テンプレートの概要

Certificate Authority Service では、一般的な証明書発行シナリオで使用できる再利用可能なパラメータ化されたテンプレートが提供されます。証明書テンプレートは、組織内での比較的静的な、明確に定義された証明書発行スキーマを表します。CertificateTemplate リソースには次のものが含まれます。

  1. テンプレートを使用するすべての証明書リクエストにおいて、リクエストされたサブジェクトと SAN に対して評価される Common Expression Language(CEL)式。CEL の使用について詳しくは、CEL の使用をご覧ください。
  2. サブジェクトまたはサブジェクトの代替名をエンドユーザーのリクエストから発行された証明書にコピーできるかどうかを指定する許可リスト。
  3. エンドユーザーのリクエストから発行済み証明書にコピーできる X.509 拡張機能がある場合は、それを指定する許可リスト(省略可)。
  4. テンプレートを使用するすべての発行済み証明書に追加さる、X.509 拡張機能の値のセット(省略可)。

証明書テンプレートは、本格的な垂直の証明書発行フレームワークとすることができます。詳細については、CertificateTemplate の完全なメッセージ定義をご覧ください。

証明書テンプレートで事前に定義された値

証明書テンプレートの事前定義された値は、証明書テンプレートを使用するすべての証明書に追加されます。mTLS やコード署名などの一般的な証明書発行シナリオを作成できます。値は次のとおりです。

  • 鍵の用途: RFC 5280 セクション 4.2.1.12 に従って、証明書の鍵の基本的用途を指定します。
  • 鍵の拡張的用途: RFC 5280 のセクション 4.2.1.3 に従って、証明書の鍵の拡張的用途を指定します。
  • 証明書が CA の場合: 証明書が追加の証明書を発行できるかどうか、または証明書がエンド エンティティ証明書であるかどうかを指定します。
  • 発行元のパスの最大長: CA の場合、この CA 証明書に連結できる CA の最大数を指定します。発行元のパスの最大長が 0 に設定されている場合、CA はエンド エンティティ証明書のみを発行できます。1 に設定されている場合、この CA 証明書の下のチェーンに下位 CA を 1 つだけ含めることができます。値が宣言されていない場合、この CA の下位にあるチェーン内の下位 CA の数は無制限です。
  • AIA OCSP サーバー: RFC 5280 セクション 4.2.2.1 で説明されている証明書の認証局情報アクセス(AIA)拡張機能の OCSP サーバーを指します。
  • 追加の X.509 拡張機能: カスタムの X.509 拡張機能について説明します。

次のコードサンプルは、証明書テンプレートの事前定義されたすべてのフィールドについて記述しています。

keyUsage:
  baseKeyUsage:
    digitalSignature: true
    keyEncipherment: true
    contentCommitment: false
    dataEncipherment: false
    keyAgreement: false
    certSign: false
    crlSign: false
    encipherOnly: false
    decipherOnly: false
  extendedKeyUsage:
    serverAuth: true
    clientAuth: false
    codeSigning: false
    emailProtection: false
    timeStamping: false
    ocspSigning: false
caOptions:
  isCa: true
  maxIssuerPathLength: 1
policyIds:
- objectIdPath:
  - 1
  - 2
  - 3
additionalExtensions:
- objectId:
    objectIdPath:
    - 1
    - 2
    - 3
  critical: false
  value: "base64 encoded extension value"

YAML で指定されていない値は、省略されるか、デフォルトで false になります。

値が指定されていない場合、次の拡張機能は省略されます。

  • keyUsage
  • policyIds
  • additionalExtensions
  • caOptions 拡張機能の maxIssuerPathLength フィールド

値が指定されていない場合、次の拡張機能はデフォルトで false になります。

  • caOptions 拡張機能の isCa フィールド

証明書テンプレートを作成する

証明書テンプレートを作成するには、次の gcloud コマンドを使用します。

gcloud

gcloud privateca templates create TEMPLATE_ID \
  --copy-subject \
  --copy-sans \
  --identity-cel-expression <expr> \
  --predefined-values-file FILE_PATH \
  --copy-all-requested-extensions \
  --copy-extensions-by-oid <1.2.3.4,5.6.7.8> \
  --copy-known-extensions <ext1,ext2>

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

  • TEMPLATE_ID: 証明書テンプレートの一意の識別子。
  • FILE_PATH: 証明書テンプレートによって設定された X.509 値を記述する YAML ファイル。

--copy-sans フラグを使用すると、証明書リクエストからサブジェクト代替名(SAN)拡張機能が署名付き証明書にコピーされます。または、--no-copy-sans を指定して、呼び出し元が指定した SAN を証明書リクエストからドロップできます。

--copy-subject フラグを使用すると、証明書リクエストからサブジェクトを署名付き証明書にコピーできます。または、--no-copy-subject を指定して、呼び出し元が指定したサブジェクトを証明書リクエストからドロップすることもできます。

--identity-cel-expression フラグは、発行前に証明書のサブジェクトとサブジェクト代替名に対して評価される CEL 式を受け取り、リクエストを許可するかどうかを示すブール値を返します。証明書テンプレートに Common Expression Language(CEL)式を使用する方法については、CEL を証明書テンプレートに使用するをご覧ください。

--predefined-values-file フラグは、このテンプレートによって設定された事前定義された X.509 値を記述した YAML ファイルへのパスを指定します。指定した拡張機能は、このテンプレートを使用する証明書リクエストにコピーされ、証明書リクエストで許可された拡張機能よりも優先されます。事前定義された X.509 値の一部を更新すると、事前定義された X.509 値のセット全体が置換されます。

--copy-all-requested-extensions フラグが設定されている場合、証明書リクエストで指定されたすべての拡張機能が署名付き証明書にコピーされます。または、--copy-extensions-by-oid フラグを使用して、証明書リクエストから署名付き証明書に特定の OID をコピーしたり、--copy-known-extensions フラグを使用して、証明書リクエストから署名済み証明書に拡張機能をコピーしたりできます。base-key-usageextended-key-usageca-optionspolicy-idsaia-ocsp-servers のいずれかにする必要があります。

証明書リクエスト内の X.509 拡張機能をすべて無視し、このテンプレートで定義されている事前定義値は保持するには、--copy-all-requested-extensions フラグを削除します。

一般的なシナリオに合わせて証明書テンプレートを作成する

このセクションでは、一般的なユースケース用の証明書テンプレートを作成するための gcloud コマンドについて説明します。

任意のドメイン用の DNS サーバーの TLS 証明書

任意のドメインを許可するサーバー TLS 証明書を発行するための証明書テンプレートを作成するには、次の手順を行います。

  1. leaf_server_tls_values.yaml という名前のファイルを作成し、次のエンド エンティティ サーバーの TLS 構成を追加します。

    leaf_server_tls_values.yaml

    keyUsage:
      baseKeyUsage:
        digitalSignature: true
        keyEncipherment: true
      extendedKeyUsage:
        serverAuth: true
    caOptions:
      isCa: false
    
  2. DNS タイプの SAN を持つ証明書のみを許可するには、次の gcloud コマンドを実行します。

    gcloud

    gcloud privateca templates create server-tls \
      --predefined-values-file leaf_server_tls_values.yaml \
      --copy-sans --no-copy-subject \
      --identity-cel-expression "subject_alt_names.all(san, san.type == DNS)"
    

    gcloud privateca templates create コマンドの詳細については、gcloud privateca templates create をご覧ください。

テストドメインのみを持つ DNS サーバーの TLS 証明書

テストドメインに限定された DNS SAN を使用してサーバー TLS 証明書を発行するための証明書テンプレートを作成するには、次の gcloud コマンドを使用します。

gcloud

gcloud privateca templates create server-tls \
  --predefined-values-file leaf_server_tls_values.yaml \
  --copy-sans --no-copy-subject \
  --identity-cel-expression "subject_alt_names.all(san, san.type == DNS && san.value.endsWith('.test.example.com'))"

leaf_server_tls_values.yaml ファイルの内容は前の例と同じでなければなりません。

CEL 式を使用して DNS 名が特定の文字列で開始または終了されていることを確認する方法については、CEL の例の式をご覧ください。

Workload Identity の証明書

相互 TLS(mTLS)証明書を発行するための証明書テンプレートを作成するには、次の手順を行います。

  1. leaf_mtls_values.yaml という名前のファイルを作成し、次のエンド エンティティの相互 TLS 構成を追加します。

    leaf_mtls_values.yaml

    keyUsage:
      baseKeyUsage:
        digitalSignature: true
        keyEncipherment: true
      extendedKeyUsage:
        serverAuth: true
        clientAuth: true
    caOptions:
      isCa: false
    
  2. SPIFFE URI SAN を持つ証明書のみを許可するには、次の gcloud コマンドを使用します。

    gcloud

    gcloud privateca templates create workload-spiffe \
      --predefined-values-file leaf_mtls_values.yaml \
      --copy-sans --no-copy-subject \
      --identity-cel-expression "subject_alt_names.all(san, san.type == URI && san.value.startsWith('spiffe://'))"
    

    gcloud privateca templates create コマンドの詳細については、gcloud privateca templates create をご覧ください。

CEL 式を使用して DNS 名が特定の文字列で開始または終了されていることを確認する方法については、CEL の例の式をご覧ください。

証明書テンプレートへのアクセス権を付与する

CA Service 証明書テンプレート ユーザー(roles/privateca.templateUser)のロールがある場合は、証明書テンプレートを使用できます。証明書テンプレートの作成者は、その証明書テンプレートを使用する可能性がある組織内のメンバーに CA Service 証明書テンプレート ユーザー ロールを付与することをおすすめします。

example.com ドメインのすべてのユーザーに CA Service 証明書テンプレート ユーザー(roles/privateca.templateUser)のロールを付与するには、次の gcloud コマンドを使用します。

gcloud

gcloud privateca templates add-iam-policy-binding TEMPLATE_ID \
  --member "domain:example.com" \
  --role "roles/privateca.templateUser"

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

  • TEMPLATE_ID: 証明書テンプレートの一意の識別子。

gcloud privateca templates add-iam-policy-binding コマンドの詳細については、gcloud privateca templates add-iam-policy-binding をご覧ください。

CA Service の IAM ロールとそれに関連する権限の詳細については、IAM によるアクセス制御をご覧ください。

次のステップ