外部 CA から下位 CA を作成する

このページでは、外部ルート CA に連結する下位認証局(CA)を作成する方法について説明します。

ルート CA と下位 CA を含む既存の公開鍵基盤(PKI)階層がある場合、同じルート CA を維持し、外部ルート CA に連結する下位 CA を下位 CA Service に作成できます。外部ルート CA の鍵とオペレーションは、Google Cloud の外部に残ります。外部ルート CA は、Google Cloud に下位 CA 証明書を発行するためにのみ使用できます。下位 CA は、外部ルート CA を信頼するワークロードによって直ちに信頼されます。下位 CA を使用すると、実行時に外部ルート CA にアクセスしなくても証明書を発行できます。

準備

  • CA Service オペレーション マネージャー(roles/privateca.caManager)または CA Service 管理者(roles/privateca.admin)の IAM ロールがあることを確認します。詳細については、IAM ポリシーの構成をご覧ください。
  • 外部ルート CA を特定します。
  • 下位 CA の名前、サブジェクト、有効期間、鍵のサイズを定義します。 詳細については、CA 設定の確認をご覧ください。

外部 CA から下位 CA を作成する

外部 CA から下位 CA を作成するには、次の手順を行います。

  1. 下位 CA 証明書署名リクエスト(CSR)の生成: まず、下位 CA の CSR を生成し、CSR をダウンロードします。

  2. 外部ルート CA によって署名された下位 CA 証明書を取得: 2 番目のステップは、署名のために CSR を外部ルート CA に送信することです。CSR の送信と署名済み証明書の取得については、外部ルート CA 固有の手順に従ってください。

  3. 署名済みの下位 CA 証明書を CA Service にインポートする: 最後のステップでは、Google Cloud CLI または Google Cloud コンソールを使用して、署名済みの PEM 証明書チェーンをアップロードします。

次のセクションでは、外部ルート CA から下位 CA を作成する方法について説明します。

CSR を作成する

コンソール

  1. Google Cloud コンソールで [セキュリティ] > [Certificate Authority Service] メニューに移動します。

    Certificate Authority Service に移動

  2. [CA マネージャー] タブをクリックします。

  3. [CA を作成] をクリックします。

CA タイプを選択:

  1. [下位 CA] をクリックします。
  2. [有効期間] フィールドに、CA 証明書が発行した証明書を有効にする期間を入力します。
  3. [ルート CA は外部] をクリックします。
  4. CA の [ティア] に、使用可能なオプションのいずれかを選択します。詳細については、オペレーション階層を選択するをご覧ください。
  5. [リージョン指定] で、リストから CA のロケーションを選択します。
  6. [次へ] をクリックします。
CA サブジェクト名を構成する
  1. [組織(O)] フィールドに、組織の名前を入力します。
  2. 省略可: [組織部門(OU)] フィールドに、会社の部門またはビジネス ユニットを入力します。
  3. 省略可: [国名] フィールドに、2 文字の国コードを入力します。
  4. 省略可: [州または省名] フィールドに、州名を入力します。
  5. 省略可: [地域名] フィールドに、都市の名前を入力します。
  6. [CA 共通名(CN)] フィールドに、CA 名を入力します。
  7. [プール ID] フィールドに、CA プールの名前を入力します。CA の作成後に CA プールを変更することはできません。
  8. [次へ] をクリックします。
CA の鍵サイズとアルゴリズムを構成する
  1. ニーズに最適な鍵アルゴリズムを選択します。適切な鍵アルゴリズムを決定する方法については、鍵アルゴリズムを選択するをご覧ください。
  2. [次へ] をクリックします。
CA アーティファクトを構成する

次の手順は省略可能です。この手順をスキップすると、デフォルト設定が適用されます。

  1. Google 管理またはセルフマネージドの Cloud Storage バケットのどちらを使用するかを選択します。
  2. セルフマネージド Cloud Storage バケットを選択しない場合、CA Service は CA と同じロケーションに Google 管理バケットを作成します。

  3. Cloud Storage バケットへの証明書失効リスト(CRL)と CA 証明書の公開を無効にするかどうかを選択します。
  4. Cloud Storage バケットでの CRL と CA 証明書の公開は、デフォルトで有効になっています。これらの設定を無効にするには、切り替えボタンをクリックします。

  5. [次へ] をクリックします。
ラベルを追加する

次の手順は省略可能です。

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

  1. [項目を追加] をクリックします。
  2. [キー 1] フィールドにラベルキーを入力します。
  3. [値 1] フィールドにラベルの値を入力します。
  4. 別のラベルを追加する場合は、 [項目を追加] をクリックします。次に、手順 2 と 3 で説明したように、ラベルキーと値を追加します。
  5. [次へ] をクリックします。
設定を確認する

すべての設定をよく確認し、[作成] をクリックして CA を作成します。

CSR をダウンロードする

  1. [認証局] ページで、有効にする CA を選択します。
  2. [有効にする] をクリックします。
  3. 表示されたダイアログで [CSR をダウンロード] をクリックします。

    CA の CSR をダウンロードします。

gcloud

  1. 下位 CA の CA プールを作成するには、次のコマンドを実行します。詳細については、CA プールの作成をご覧ください。

    gcloud privateca pools create SUBORDINATE_POOL_ID
    

    SUBORDINATE_POOL_ID を、CA プールの名前に置き換えます。

  2. 作成した CA プールに下位 CA を作成するには、次の gcloud コマンドを実行します。gcloud コマンドも CSR を作成し、FILE_NAME ファイルに保存します。

    gcloud privateca subordinates create SUBORDINATE_CA_ID \
      --pool=SUBORDINATE_POOL_ID \
      --create-csr --csr-output-file=FILE_NAME \
      --key-algorithm="ec-p256-sha256" \
      --subject="CN=Example Server TLS CA, O=Example LLC"
    

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

    • SUBORDINATE_CA_ID: 下位 CA の一意の識別子。
    • SUBORDINATE_POOL_ID: CA プールの名前。
    • FILE_NAME: PEM でエンコードされた CSR が書き込まれるファイルの名前。

    --key-algorithm フラグは、CA のマネージド Cloud HSM 鍵の作成に使用する暗号アルゴリズムを受け取ります。

    --subject フラグは、証明書のサブジェクトの X.501 名を受け取ります。

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

CSR が作成されると、次のステートメントが返されます。

Created Certificate Authority [projects/my-project-pki/locations/us-west1/caPools/SUBORDINATE_POOL_ID/certificateAuthorities/SUBORDINATE_CA_ID] and saved CSR to FILE_NAME.

使用可能な設定をすべて一覧表示するには、次のコマンドを実行します。

gcloud privateca subordinates create --help

CSR を紛失した場合は、次のコマンドを使用して CSR を再度ダウンロードできます。

gcloud privateca subordinates get-csr SUBORDINATE_CA_ID \
  --pool=SUBORDINATE_POOL_ID

Terraform

  1. CA プールとその CA プールの下位 CA を作成するには、次の構成ファイルを使用します。

    resource "google_privateca_ca_pool" "default" {
      name     = "test-ca-pool"
      location = "us-central1"
      tier     = "ENTERPRISE"
    }
    
    resource "google_privateca_certificate_authority" "sub-ca" {
      pool = google_privateca_ca_pool.default.name
      certificate_authority_id = "my-certificate-authority-sub"
      location = "us-central1"
      config {
        subject_config {
          subject {
            organization = "HashiCorp"
            common_name = "my-subordinate-authority"
          }
          subject_alt_name {
            dns_names = ["hashicorp.com"]
          }
        }
        x509_config {
          ca_options {
            is_ca = true
            # Force the sub CA to only issue leaf certs
            max_issuer_path_length = 0
          }
          key_usage {
            base_key_usage {
              cert_sign = true
              crl_sign = true
            }
            extended_key_usage {
            }
          }
        }
      }
      lifetime = "86400s"
      key_spec {
        algorithm = "RSA_PKCS1_4096_SHA256"
      }
      type = "SUBORDINATE"
    }
    
  2. CSR を取得するには、次の構成を追加します。

    data "google_privateca_certificate_authority" "sub-ca-csr" {
      location = "us-central1"
      pool = google_privateca_ca_pool.default.name
      certificate_authority_id = google_privateca_certificate_authority.sub-ca.certificate_authority_id
    }
    
    output "csr" {
      value = data.google_privateca_certificate_authority.sub-ca-csr.pem_csr
    }
    
  3. terraform apply を実行します。

CSR に署名する

生成された CSR ファイルを、証明書の発行を担当する組織のメンバーに渡して、署名するようリクエストします。具体的な手順は、組織の設定によって異なります。

次の openssl コマンドを使用して、シンプルなルート CA を試すことができます。

Shell

新しいルート CA の設定を構成します。

cat > root.conf <<- EOM
[ req ]
distinguished_name = req_distinguished_name
x509_extensions    = v3_ca
prompt             = no
[ req_distinguished_name ]
commonName = Sample Root
[ v3_ca ]
subjectKeyIdentifier=hash
basicConstraints=critical, CA:true
EOM

新しいルート CA を作成します。

openssl req -x509 -new -nodes -config root.conf -keyout rootCA.key \
  -days 3000 -out rootCA.crt -batch

新しい下位 CA 証明書に追加する拡張機能を構成します。

cat > extensions.conf <<- EOM
basicConstraints=critical,CA:TRUE,pathlen:0
keyUsage=critical,keyCertSign,cRLSign
extendedKeyUsage=critical,serverAuth
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOM

このルートで下位 CA の CSR に署名します。

openssl x509 -req -in FILE_NAME -CA rootCA.crt -CAkey rootCA.key \
  -CAcreateserial -out subordinate.crt -days 1095 -sha256 -extfile extensions.conf

証明書チェーン全体を 1 つのファイルに連結します。

cat subordinate.crt > chain.crt
cat rootCA.crt >> chain.crt

署名済みの証明書をアップロードする

署名付き証明書を使用して下位 CA を有効にする手順は次のとおりです。

コンソール

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

    Certificate Authority Service に移動

  2. [CA マネージャー] タブをクリックします。

  3. [認証局] で、作成した下位 CA を選択します。

  4. [有効にする] をクリックします。

  5. 表示されたダイアログで [CSR をダウンロード] をクリックして、発行 CA が署名できる PEM でエンコードされた CSR ファイルをダウンロードします。

  6. [次へ] をクリックします。

  7. [証明書チェーンをアップロード] フィールドで、[ブラウジング] をクリックします。

  8. 拡張子が .crt の署名付き証明書ファイルをアップロードします。

  9. [Activate] をクリックします。

gcloud

gcloud privateca subordinates activate SUBORDINATE_CA_ID \
  --pool=SUBORDINATE_POOL_ID \
  --pem-chain ./chain.crt

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

  • SUBORDINATE_CA_ID: 有効にする下位 CA の一意の識別子。
  • SUBORDINATE_POOL_ID: 下位 CA を含む CA プールの名前。

--pem-chain フラグは必須です。 このフラグは、PEM でエンコードされた証明書のリストを含むファイルを受け取ります。証明書のリストは現在の CA 証明書で始まり、ルート CA 証明書で終わります。

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

署名済みの証明書がアップロードされると、次のステートメントが返されます。

Activated certificate authority [SUBORDINATE_CA_ID].

Terraform

  1. 署名済みの CA 証明書を subordinate.crt としてローカルに保存します。
  2. 署名者の CA 証明書を rootCA.crt としてローカルに保存します。
  3. CA の有効化後に許可されていない CSR を取得しようとするため、最初の手順で説明した CSR を取得するための構成を削除します。
  4. 次のフィールドで下位 CA の構成を更新し、terraform apply を実行します。

      pem_ca_certificate     = file("subordinate.crt")
      subordinate_config {
        pem_issuer_chain {
            pem_certificates = [file("rootCA.crt")]
        }
      }
    

    発行元チェーンに複数の CA が含まれている場合は、値を [file("intermediateCA.cert"), file("rootCA.crt")] として指定します。

次のステップ