証明書をリクエスト

このドキュメントでは、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: ユーザー プロジェクトが存在する 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 ユーザー プロジェクトが存在する 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: ユーザー プロジェクトが存在する 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: ユーザー プロジェクトが存在する 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 ユーザー プロジェクトが存在する 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: ユーザー プロジェクトが存在する 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: ユーザー プロジェクトが存在する 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: ユーザー プロジェクトが存在する 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: ユーザー プロジェクトが存在する 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割り当てを調整するには、組織内のインフラストラクチャ オペレーター グループのメンバーにお問い合わせください。ランブック PLATAUTH-G2102 の手順に沿って、割り当てをオーバーライドできます。

自動クリーンアップ

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

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