証明書をリクエスト

このドキュメントでは、Certificate Authority Service(CAS)を使用して証明書をリクエストする手順について説明します。

Google Distributed Cloud(GDC)エアギャップ内で信頼を確立し、通信を保護するには、Certificate Authority Service から ACME 対応または無効の証明書をリクエストします。

このドキュメントは、プロジェクト内で証明書のライフサイクルを管理するアプリケーション デベロッパーやデータ サイエンティストなど、アプリケーション オペレーター グループ内のユーザーを対象としています。詳細については、 GDC エアギャップ ドキュメントの対象読者をご覧ください。

始める前に

証明書をリクエストする前に、必要な権限をリクエストして環境を準備する必要があります。

IAM ロールをリクエストする

証明書リクエストを作成、表示、削除するには、組織 IAM 管理者に連絡して、認証局のプロジェクト名前空間で CA Service 証明書リクエスタ (certificate-authority-service-certificate-requester)ロールを付与してもらいます。

環境を準備する

ACME モードが有効になっている CA を使用して証明書をリクエストする

認証局が ACME モードでホストされている場合、準備が完了すると、ステータスに ACME サーバー URL が出力されます。

Distributed Cloud 環境から CA ACME サーバー URL を収集します。

kubectl get certificateauthorities CA_NAME -n USER_PROJECT_NAMESPACE -ojson | jq -r '.status.acme.uri'

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

  • CA_NAME: CA の名前。ルート CA またはサブ CA を指定できます。
  • USER_PROJECT_NAMESPACE: ユーザー プロジェクトが存在する名前空間の名前

ACME モードが無効になっている CA を使用して証明書をリクエストする

ACME モードが無効になっている証明書リクエストを作成するには、CertificateRequest リソースを作成して、Distributed Cloud エアギャップ インスタンスに適用する必要があります。これには次の 2 つの方法があります。

  • CertificateResource を作成し、リソースに CSR を含めます。
  • GDC で自動生成された秘密鍵を使用して CertificateResource を作成し、証明書の構成をカスタム値として指定します。

CSR を使用して証明書をリクエストする

  1. CertificateRequest リソースを作成し、cert-request.yaml という名前の YAML ファイルとして保存します。秘密鍵を使用して証明書署名リクエスト(CSR)を作成し、リソースに追加します。

    必要に応じて、テンプレートの名前を certificateTemplate フィールドに入力して、事前構成された X.509 パラメータのセットで証明書を発行できます。

    apiVersion: pki.security.gdc.goog/v1
    kind: CertificateRequest
    metadata:
      name: CERT_REQ_NAME
      namespace: USER_PROJECT_NAMESPACE
    spec:
      certificateAuthorityRef:
        name: CA_NAME
        namespace: USER_PROJECT_NAMESPACE
      csr: CSR
      certificateTemplate: TEMPLATE_NAME
      signedCertificateSecret: SECRET_NAME
      notBefore: VALIDITY_START_TIME
      notAfter: VALIDITY_END_TIME
      subjectOverride: SUBJECT_OVERRIDE
    

    次の変数を置き換えます。

    変数 説明
    CERT_REQ_NAME CertificateRequest リソースの名前
    USER_PROJECT_NAMESPACE ユーザー プロジェクトが存在する名前空間の名前
    CA_NAME CA の名前。ルート CA またはサブ CA を指定できます。
    CSR CA を使用して署名する証明書署名リクエスト
    SECRET_NAME 秘密鍵と 署名付き CA 証明書を保持する Kubernetes Secret の名前

    次の省略可能な変数を置き換えます。

    変数 説明
    TEMPLATE_NAME 使用する事前定義された証明書テンプレートの名前。使用可能なテンプレートの一覧と競合の詳細については、 事前定義された証明書テンプレートをご覧ください。
    VALIDITY_START_TIME 証明書が有効と見なされる時刻。この値 は YYYY-MM-DDTHH:MM:SSZ 形式(例: 2025-10-19T21:45:30Z)にする必要があります。設定しない場合、証明書は発行後 すぐに有効になります。
    VALIDITY_END_TIME 証明書の有効期限が切れる時刻。この値は YYYY-MM-DDTHH:MM:SSZ 形式(例: 2026-01-17T18:25:40Z)にする必要があります。設定しない場合、証明書は開始時刻から 90 日後に期限切れになります。
    SUBJECT_OVERRIDE 発行された証明書で使用するカスタムのサブジェクト。 CSR のサブジェクト情報をオーバーライドします。この値は、ASN.1 DER エンコードされた X.509 サブジェクトとして指定します。
  2. カスタム リソースを Distributed Cloud インスタンスに適用します。

    kubectl apply -f cert-request.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
    

    MANAGEMENT_API_SERVER_KUBECONFIG は、Management API サーバーの kubeconfig ファイルのパスに置き換えます。

  3. 証明書リクエストの準備状況を確認します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequest.pki.security.gdc.goog/CERT_REQ_NAME -ojson | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'
    

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

    • MANAGEMENT_API_SERVER_KUBECONFIG: Management API サーバーの kubeconfig ファイルのパス
    • USER_PROJECT_NAMESPACE: ユーザー プロジェクトが存在する名前空間の名前
    • CERT_REQ_NAME : CertificateRequest リソースの名前

    出力は次のようになります。

    {
      "lastTransitionTime": "2025-01-27T12:22:59Z",
      "message": "Certificate is issued",
      "observedGeneration": 1,
      "reason": "Issued",
      "status": "True",
      "type": "Ready"
    }
    
  4. 証明書の Secret 名を取得します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequest.pki.security.gdc.goog/CERT_REQ_NAME -ojson | jq -r '.spec.signedCertificateSecret'
    

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

    • MANAGEMENT_API_SERVER_KUBECONFIG: Management API サーバーの kubeconfig ファイルのパス
    • USER_PROJECT_NAMESPACE: ユーザー プロジェクトが存在する名前空間の名前
    • CERT_REQ_NAME : CertificateRequest リソースの名前

    出力には、署名付き証明書を含む SECRET_NAME が表示されます。

    test-jwk-1
    

自動生成された鍵を使用して証明書をリクエストする

  1. CertificateRequest リソースを作成し、cert-request.yaml という名前の YAML ファイルとして保存します。証明書に選択した値を入力します。

    必要に応じて、テンプレートの名前を certificateTemplate フィールドに入力して、事前構成された X.509 パラメータのセットで証明書を発行できます。

    apiVersion: pki.security.gdc.goog/v1
    kind: CertificateRequest
    metadata:
      name: CERT_REQ_NAME
      namespace: USER_PROJECT_NAMESPACE
    spec:
      certificateAuthorityRef:
        name: CA_NAME
        namespace: USER_PROJECT_NAMESPACE
      certificateConfig:
        subjectConfig:
          commonName: COMMON_NAME
          organization: ORGANIZATION
          locality: LOCALITY
          state: STATE
          country: COUNTRY
          dnsNames:
          - DNS_NAMES
          ipAddresses:
          - IP_ADDRESSES
          rfc822Names:
          - RFC822NAMES
          uris:
          - URIS
      certificateTemplate: TEMPLATE_NAME
      signedCertificateSecret: SECRET_NAME
      notBefore: VALIDITY_START_TIME
      notAfter: VALIDITY_END_TIME
      subjectOverride: SUBJECT_OVERRIDE
    

    次の変数を置き換えます。

    変数 説明
    CERT_REQ_NAME CertificateRequest リソースの名前
    USER_PROJECT_NAMESPACE ユーザー プロジェクトが存在する名前空間の名前
    CA_NAME CA の名前。ルート CA またはサブ CA を指定できます。
    SECRET_NAME 秘密鍵と 署名付き CA 証明書を保持する Kubernetes Secret の名前

    次の省略可能な変数を置き換えます。CertificateRequest リソースの spec.certificateConfig.subjectConfig ブロックから少なくとも 1 つのフィールドを含める必要があります。

    変数 説明
    COMMON_NAME 証明書の共通名
    ORGANIZATION 証明書で使用する組織
    LOCALITY 証明書の地域
    STATE 証明書で使用する都道府県
    COUNTRY 証明書の国
    DNS_NAMES 証明書に設定する dNSName subjectAltNames のリスト
    IP_ADDRESS 証明書に設定する ipAddress subjectAltNames のリスト
    RFC822_NAMES 証明書に設定する rfc822Name subjectAltNames のリスト
    URIS 証明書に設定する uniformResourceIdentifier subjectAltNames のリスト
    TEMPLATE_NAME 使用する事前定義された証明書テンプレートの名前。使用可能なテンプレートの一覧と競合の詳細については、 事前定義された証明書テンプレートをご覧ください。
    VALIDITY_START_TIME 証明書が有効と見なされる時刻。この値 は YYYY-MM-DDTHH:MM:SSZ 形式(例: 2025-10-19T21:45:30Z)にする必要があります。設定しない場合、証明書は発行後 すぐに有効になります。
    VALIDITY_END_TIME 証明書の有効期限が切れる時刻。この値は YYYY-MM-DDTHH:MM:SSZ 形式(例: 2026-01-17T18:25:40Z)にする必要があります。設定しない場合、証明書は開始時刻から 90 日後に期限切れになります。
    SUBJECT_OVERRIDE 発行された証明書で使用するカスタムのサブジェクト。 CSR のサブジェクト情報をオーバーライドします。この値は、ASN.1 DER エンコードされた X.509 サブジェクトとして指定します。
  2. カスタム リソースを Distributed Cloud インスタンスに適用します。

    kubectl apply -f cert-request.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
    

    MANAGEMENT_API_SERVER_KUBECONFIG は、Management API サーバーの kubeconfig ファイルのパスに置き換えます。

  3. 証明書リクエストの準備状況を確認します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequest.pki.security.gdc.goog/CERT_REQ_NAME -ojson | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'
    

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

    • MANAGEMENT_API_SERVER_KUBECONFIG: Management API サーバーの kubeconfig ファイルのパス
    • USER_PROJECT_NAMESPACE: ユーザー プロジェクトが存在する名前空間の名前
    • CERT_REQ_NAME : CertificateRequest リソースの名前

    出力は次のようになります。

    {
      "lastTransitionTime": "2025-01-27T12:22:59Z",
      "message": "Certificate is issued",
      "observedGeneration": 1,
      "reason": "Issued",
      "status": "True",
      "type": "Ready"
    }
    
  4. 証明書の Secret 名を取得します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequest.pki.security.gdc.goog/CERT_REQ_NAME -ojson | jq -r '.spec.signedCertificateSecret'
    

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

    • MANAGEMENT_API_SERVER_KUBECONFIG: Management API サーバーの kubeconfig ファイルのパス
    • USER_PROJECT_NAMESPACE: ユーザー プロジェクトが存在する名前空間の名前
    • CERT_REQ_NAME: CertificateRequest リソースの名前

    出力には、署名付き証明書を含む SECRET_NAME が表示されます。

    test-jwk-1
    

証明書リクエストを一覧表示する

certificaterequests パラメータを使用して、すべての CertificateRequest リソースを一覧表示します。

kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequest.pki.security.gdc.goog

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

  • MANAGEMENT_API_SERVER_KUBECONFIG: Management API サーバーの kubeconfig ファイルのパス
  • USER_PROJECT_NAMESPACE: ユーザー プロジェクトが存在する名前空間の名前

次に、agtest-project 名前空間を使用するコマンドの例を示します。

kubectl --kubeconfig /root/release/root-admin/root-admin-kubeconfig  -n agtest-project get certificaterequest.pki.security.gdc.goog

想定される出力は次のようになります。

NAME                                               READY   AGE
test-externalca-subca-cert-req-with-csr            True    17h
test-externalca-subca-cert-req-with-csr-override   True    17h

証明書を削除する

証明書を削除するには、対応する CertificateRequest カスタム リソースを削除する必要があります。この操作を行うと、CAS データベースからリソースが削除されます。

  1. 削除する CertificateRequest の名前を確認します。証明書リクエストを 一覧表示すると、名前を見つけやすくなります。

  2. CertificateRequest リソースを削除します。

    kubectl --kubeconfig  MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE delete certificaterequest.pki.security.gdc.goog/CERT_REQ_NAME
    

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

    • MANAGEMENT_API_SERVER_KUBECONFIG: Management API サーバーの kubeconfig ファイルのパス
    • USER_PROJECT_NAMESPACE: ユーザー プロジェクトが存在する名前空間の名前
    • CERT_REQ_NAME: CertificateRequest リソースの名前

証明書リクエストの上限とクリーンアップ

システムの安定性を維持し、リソースの使用率が高くなるのを防ぐため、CAS では CertificateRequest カスタム リソースの数に上限が適用され、オプションの自動クリーンアップ機能が提供されています。

証明書リクエストの割り当て

CAS では、組織あたりの CertificateRequest カスタム リソースの数に割り当てが適用され、デフォルトの上限は 5,000 です。この上限を超えると、CAS と Management API サーバーのパフォーマンスが低下する可能性があります。

CertificateRequest リソースの合計数が割り当てに近づくと(上限の 80% と 90% など)、新しいリクエストを作成するときにコマンド出力に警告が表示されます。割り当てに達した後に CertificateRequest を作成しようとすると、リクエストは拒否されます。 次のようなエラー メッセージが表示されることがあります。

Error from server (Forbidden): error when creating "cert-request.yaml":
admission webhook "certificaterequests.pki.security.gdc.goog" denied the
request: the number of certificate requests has exceeded the per organization
limit of {LIMIT}. Please refer to the guide PLATAUTH-G2102 for troubleshooting
this issue

このエラーが発生した場合は、古い リソースや不要なCertificateRequestリソースを削除する必要があります。割り当てを調整するには、組織内のインフラストラクチャ オペレーター グループのメンバーにお問い合わせください。 runbook PLATAUTH-G2102の手順に沿って、割り当てをオーバーライドできます。

自動クリーンアップ

自動クリーンアップを有効にして、期限切れの CertificateRequest リソースを削除できます。この機能を使用すると、構成可能な猶予期間後にリソースが削除されるため、リソースを解放できます。猶予期間は、証明書の有効期限が切れてから CertificateRequest リソースが削除されるまでの期間を定義します。

自動クリーンアップはデフォルトで無効になっています。組織内のインフラストラクチャ オペレーター グループのメンバーは、runbook PLATAUTH-G2103の手順に沿って、この機能を有効にして猶予期間を構成できます。 猶予期間が設定されていない場合、またはゼロに設定されている場合、この機能は無効のままになります。