外部 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 証明書を取得する: 次に、CSR を外部ルート CA に送信して署名します。CSR の送信と署名付き証明書の取得については、外部ルート CA の具体的な手順に従ってください。

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

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

CSR を作成する

Console

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

    Certificate Authority Service に移動

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

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

CA タイプを選択:

  1. [下位 CA] をクリックします。
  2. [有効期間] フィールドに、CA 証明書が発行した証明書を有効にする期間を入力します。
  3. [Root CA is external] をクリックします。
  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 --location=LOCATION
    

    以下を置き換えます。

    • SUBORDINATE_POOL_ID: CA プールの名前。
    • LOCATION: CA プールのロケーション。
  2. 作成した CA プールに下位 CA を作成するには、次の gcloud コマンドを実行します。gcloud コマンドは CSR を作成して FILE_NAME ファイルに保存します。

      gcloud privateca subordinates create SUBORDINATE_CA_ID \
          --pool=SUBORDINATE_POOL_ID \
          --location=LOCATION \
          --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 プールの名前。
    • LOCATION: 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 \
    --location=LOCATION

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 を有効にする手順は次のとおりです。

Console

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

    Certificate Authority Service に移動

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

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

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

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

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

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

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

  9. [有効化] をクリックします。

gcloud

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

以下を置き換えます。

  • SUBORDINATE_CA_ID: 有効にする下位 CA の固有識別子。
  • SUBORDINATE_POOL_ID: 下位 CA を含む CA プールの名前。
  • LOCATION: 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")] として指定します。

次のステップ