証明書テンプレートを作成する
このページでは、証明書テンプレートの属性と、証明書テンプレートの作成方法について説明します。
証明書テンプレートの概要
Certificate Authority Service は、一般的な証明書発行シナリオに使用できる再利用可能なパラメータ化されたテンプレートを提供します。証明書テンプレートは、組織内の比較的静的で明確に定義された証明書発行スキーマを表します。CertificateTemplate
リソースには次のものが含まれます。
- リクエストされたサブジェクトと、テンプレートを使用するすべての証明書リクエストの SAN に対して評価される Common Expression Language(CEL)式。CEL の使用の詳細については、CEL の使用をご覧ください。
- サブジェクトまたはサブジェクトの代替名をエンドユーザーのリクエストから発行済み証明書にコピーできるかどうかを指定する許可リスト。
- エンドユーザーのリクエストから発行済み証明書にコピーできる X.509 拡張機能がある場合は、それを指定する許可リスト(省略可)。
- テンプレートを使用するすべての発行済み証明書に追加さる、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 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-usage
、extended-key-usage
、ca-options
、policy-ids
、aia-ocsp-servers
のいずれかにする必要があります。
証明書リクエスト内の X.509 拡張機能をすべて無視し、このテンプレートで定義されている事前定義値は保持するには、--copy-all-requested-extensions
フラグを削除します。
一般的なシナリオ用の証明書テンプレートを作成する
このセクションでは、一般的なユースケースの証明書テンプレートを作成するための gcloud
コマンドについて説明します。
任意のドメイン用の DNS サーバーの TLS 証明書
任意のドメインを許可するサーバー TLS 証明書を発行するための証明書テンプレートを作成するには、次の手順を行います。
leaf_server_tls_values.yaml
という名前のファイルを作成し、次のエンド エンティティ サーバーの TLS 構成を追加します。keyUsage: baseKeyUsage: digitalSignature: true keyEncipherment: true extendedKeyUsage: serverAuth: true caOptions: isCa: false
DNS
タイプの SAN を持つ証明書のみを許可するには、次の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 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)証明書を発行する証明書テンプレートを作成するには、次の手順を使用します。
leaf_mtls_values.yaml
という名前のファイルを作成し、次のエンド エンティティの相互 TLS 構成を追加します。keyUsage: baseKeyUsage: digitalSignature: true keyEncipherment: true extendedKeyUsage: serverAuth: true clientAuth: true caOptions: isCa: false
SPIFFE URI SAN を使用する証明書のみを許可するには、次の
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 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 によるアクセス制御をご覧ください。
次のステップ
- Common Expression Language について学習する。
- Common Expression Language の使用方法を学習する。
- 証明書プロファイルについて学習する。