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

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

ルート CA と下位 CA を含む既存の公開鍵基盤(PKI)階層がある場合、同じルート CA を維持し、外部ルート CA に連結する下位 CA を下位 CA Service に作成できます。外部ルート CA の鍵とオペレーションは Google Cloud の外部に残ります。外部ルート CA のみが下位 CA 証明書を Google Cloud に発行できます。下位 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. [ルート 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 を有効にする手順は次のとおりです。

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 \
  --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")] として指定します。

次のステップ