証明書テンプレートを使用して証明書をリクエストする

このページでは、証明書テンプレートを使用して証明書をリクエストする方法について説明します。

証明書テンプレートを使用すると、証明書の発行にきめ細かいポリシー制御を実装できます。たとえば、証明書テンプレートを使用して、組織内の CA プール全体でサーバー TLS 証明書の発行を標準化できます。 または、証明書テンプレートを使用して、特定のユーザーなど、より細かいレベルでポリシーを適用することもできます。これは、さまざまな個人が発行できる証明書の種類を制限する必要がある場合に役立ちます。また、一般的な発行シナリオのためにテンプレートを再利用することもできます。

始める前に

  1. CA Service 用に環境を準備します

  2. 証明書テンプレートを使用して証明書を発行するために必要な権限を取得するには、証明書テンプレートに対する CA Service 証明書テンプレート ユーザー(roles/privateca.templateUser)の IAM ロールを付与するよう管理者に依頼してください。

    CA Service の事前定義された IAM ロールの詳細については、IAM を使用したアクセス制御をご覧ください。

    プリンシパルに IAM ロールを付与する方法については、単一のロールを付与するをご覧ください。

証明書発行をテスト

証明書テンプレートを使用して署名付き証明書をリクエストする前に、証明書テンプレートで証明書を正常に生成できることを確認することをおすすめします。CA プールの発行ポリシーと証明書テンプレートのポリシーの間に競合がある場合、証明書の発行は失敗します。発行をテストすることで、このような競合を事前に特定して解決できます。テスト証明書は PEM エンコードされず、署されておらず、生成に対して課金されないことに注意してください。

証明書テンプレートを使用した証明書の発行をテストするには、次の手順を行います。

コンソール

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

    Certificate Authority Service に移動

  2. [テンプレート マネージャー] タブをクリックします。

  3. テストする証明書テンプレートをクリックします。[テンプレートの詳細] ページが表示されます。

  4. テスト リクエストを作成するには、[証明書を作成] をクリックし、[証明書発行をテスト] をクリックします。証明書リクエスト フォームが表示されます。

  5. 証明書リクエストの作成に必要な次の詳細を指定します。

    • リージョン: 証明書のロケーション。これは、CA プールのロケーションと同じである必要があります。
    • CA プール: 証明書を発行する CA プール。
    • 証明書テンプレート: 証明書の発行に使用するテンプレート。
    • ドメイン: SSL または TLS 証明書で保護するサイトのドメイン名。
  6. [証明書を生成] をクリックします。

  7. 証明書が作成されたら、[表示] をクリックします。テスト証明書またはサンプル証明書が、同じページの別のパネルに表示されます。

  8. 競合が原因で証明書の発行が失敗した場合は、競合を解決して、テスト証明書リクエストを再度送信します。

証明書テンプレートを使用して証明書を発行する

証明書テンプレートを使用して署名付き証明書を発行するには、次の手順を行います。

コンソール

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

    Certificate Authority Service に移動

  2. [テンプレート マネージャー] タブをクリックします。

  3. [証明書テンプレート] ページで、使用する証明書テンプレートをクリックします。[テンプレートの詳細] ページが表示されます。

  4. [証明書を作成] をクリックします。

  5. リージョンを選択します。 このリージョンは、使用する CA プールのリージョンと同じにする必要があります。

  6. CA プールを選択します。

  7. 証明書署名リクエスト(CSR)を使用して証明書を生成するには、CSR を使用して証明書をリクエストするをご覧ください。

  8. 自動生成された鍵を使用して証明書を生成するには、自動生成された鍵を使用して証明書をリクエストするをご覧ください。

証明書を生成する

  1. [証明書を生成] をクリックします。証明書が正常に生成されると、メッセージが表示されます。
  2. 生成された証明書を表示するには、[証明書を表示] をクリックし、[表示] をクリックします。

省略可: 署名付き証明書をダウンロードする

  1. PEM でエンコードされた証明書チェーンをダウンロードするには、[証明書チェーンをダウンロード] をクリックします。
  2. 関連付けられた PEM でエンコードされた秘密鍵をダウンロードするには、[秘密鍵をダウンロード] をクリックします。

gcloud

証明書テンプレートを使用して証明書を発行するには、次の形式で --template フラグを gcloud privateca certificates create コマンドに追加します。

--template=projects/PROJECT_ID/locations/LOCATION/certificateTemplates/CERTIFICATE_TEMPLATE

CERTIFICATE_TEMPLATE は、この証明書の発行に使用する証明書テンプレートの名前に置き換えます。指定したテンプレートは、発行元の CA プールと同じロケーションに存在する必要があります。詳細については、テスト DNS 証明書の生成本番環境証明書の生成用のサンプルをご覧ください。

Terraform

/**
 * Copyright 2022 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

resource "google_privateca_certificate_template" "template" {
  location    = "us-central1"
  name        = "my-certificate-template"
  description = "An updated sample certificate template"

  identity_constraints {
    allow_subject_alt_names_passthrough = true
    allow_subject_passthrough           = true

    cel_expression {
      description = "Always true"
      expression  = "true"
      location    = "any.file.anywhere"
      title       = "Sample expression"
    }
  }

  passthrough_extensions {
    additional_extensions {
      object_id_path = [1, 6]
    }

    known_extensions = ["EXTENDED_KEY_USAGE"]
  }

  predefined_values {
    additional_extensions {
      object_id {
        object_id_path = [1, 6]
      }

      value    = "c3RyaW5nCg=="
      critical = true
    }

    aia_ocsp_servers = ["string"]

    ca_options {
      is_ca                  = false
      max_issuer_path_length = 6
    }

    key_usage {
      base_key_usage {
        cert_sign          = false
        content_commitment = true
        crl_sign           = false
        data_encipherment  = true
        decipher_only      = true
        digital_signature  = true
        encipher_only      = true
        key_agreement      = true
        key_encipherment   = true
      }

      extended_key_usage {
        client_auth      = true
        code_signing     = true
        email_protection = true
        ocsp_signing     = true
        server_auth      = true
        time_stamping    = true
      }

      unknown_extended_key_usages {
        object_id_path = [1, 6]
      }
    }

    policy_ids {
      object_id_path = [1, 6]
    }
  }
}

resource "google_privateca_certificate_authority" "test_ca" {
  pool                     = "my-pool"
  certificate_authority_id = "my-certificate-authority-test-ca"
  location                 = "us-central1"
  deletion_protection      = false # set to true to prevent destruction of the resource
  config {
    subject_config {
      subject {
        organization = "HashiCorp"
        common_name  = "my-certificate-authority"
      }
      subject_alt_name {
        dns_names = ["hashicorp.com"]
      }
    }
    x509_config {
      ca_options {
        # is_ca *MUST* be true for certificate authorities
        is_ca = true
      }
      key_usage {
        base_key_usage {
          # cert_sign and crl_sign *MUST* be true for certificate authorities
          cert_sign = true
          crl_sign  = true
        }
        extended_key_usage {
          server_auth = false
        }
      }
    }
  }
  key_spec {
    algorithm = "RSA_PKCS1_4096_SHA256"
  }
}

resource "google_privateca_certificate" "default" {
  pool                  = "my-pool"
  location              = "us-central1"
  certificate_authority = google_privateca_certificate_authority.test_ca.certificate_authority_id
  lifetime              = "860s"
  name                  = "my-certificate-from-template"
  pem_csr               = tls_cert_request.example.cert_request_pem
  certificate_template  = google_privateca_certificate_template.template.id
}

resource "tls_private_key" "example" {
  algorithm = "RSA"
}

resource "tls_cert_request" "example" {
  private_key_pem = tls_private_key.example.private_key_pem

  subject {
    common_name  = "example.com"
    organization = "ACME Examples, Inc"
  }
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

証明書リクエスト フォームのリンクを組織内の他のユーザーと共有して、同じパラメータを使用して証明書をリクエストできるようにするには、次の操作を行います。

コンソール

  1. Google Cloud コンソールで [CA プール マネージャー] タブに移動し、[リクエスト フォーム共有リンク] をクリックします。
  2. 表示された [リクエスト フォーム共有リンク] パネルで、リクエストの作成に選択した CA プールと証明書テンプレートを選択します。証明書リクエスト リンクが表示されます。
  3. リンクをコピーし、必要に応じて共有します。

ポリシーの競合を解決する

CA プールの発行ポリシーと証明書テンプレートの間に競合がある場合、証明書リクエストは無効な引数エラーで失敗します。たとえば、同じ拡張機能(鍵の基本的用途など)が CA プールのベースライン値と証明書テンプレートの事前定義された値で定義されている場合です。または、1 つのポリシーで特定の拡張機能を除外する拡張機能の制約があり、もう 1 つのポリシーでベースライン値にその拡張機能の値を定義している場合です。

ポリシーの競合を表示して解決する手順は次のとおりです。

コンソール

  1. エラー メッセージが表示されている [発行ポリシーのトラブルシューティング] リンクをクリックします。トラブルシューティング ページが表示されます。ここで、CA プールの発行ポリシーのベースライン値と拡張機能の制約を、証明書テンプレートのポリシーのベースライン値および拡張機能の制約と比較できます。ポリシーの競合がハイライト表示されています。
  2. CA プールまたは証明書テンプレートのいずれかにアクセスして、競合する値を更新し、競合を解決します。
  3. 競合が解決されたら、証明書リクエストを再度送信します。

テンプレートを使用して発行された証明書を表示する

証明書テンプレートを使用して発行された証明書を表示するには、次の手順を行います。

コンソール

  1. Google Cloud コンソールで、[テンプレート マネージャー] タブに移動します。
  2. 証明書の発行に使用した証明書テンプレートをクリックします。
  3. [テンプレートの詳細] ページで、[証明書] をクリックします。選択した証明書テンプレートを使用して発行された証明書のリストが表示されます。

次のステップ