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

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

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

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 によるアクセス制御をご覧ください。

次のステップ