要求取得憑證

本頁說明如何使用憑證授權單位服務申請憑證。

如要在 Google Distributed Cloud (GDC) 氣隙環境中建立信任關係並確保通訊安全,請向憑證授權單位服務要求啟用或停用 ACME 的憑證。

事前準備

提出憑證要求前,請確認您具備必要權限和 kubeconfig 檔案。

所需權限

如要取得要求憑證所需的權限,請要求機構 IAM 管理員授予您 CA 服務憑證要求者 (certificate-authority-service-certificate-requester) 角色。如要進一步瞭解角色,請參閱角色定義

取得 kubeconfig 檔案

如要對 Management API 伺服器執行指令,請按照下列步驟操作:

  1. 登入並產生 Management API 伺服器的 kubeconfig 檔案 (如果沒有)。

  2. 使用 Management API 伺服器的 kubeconfig 檔案路徑,取代這些操作說明中的 MANAGEMENT_API_SERVER_KUBECONFIG

使用啟用 ACME 模式的 CA 要求憑證

如果憑證授權單位是以 ACME 模式代管,在準備就緒後,狀態會輸出 ACME 伺服器網址。

從 Distributed Cloud 環境收集 CA ACME 伺服器網址:

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

更改下列內容:

  • CA_NAME:CA 的名稱,可以是根 CA 或子 CA。
  • USER_PROJECT_NAMESPACE:使用者專案所在的命名空間名稱。

使用 CA 要求憑證 (已停用 ACME 模式)

如要建立停用 ACME 模式的憑證要求,您必須建立 CertificateRequest 資源並套用至 Distributed Cloud 氣隙執行個體。如要這樣做,方法有兩種:

  • 建立 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 憑證名稱。
    USER_PROJECT_NAMESPACE 使用者專案所在的命名空間名稱。
    CA_NAME CA 的名稱,可以是根 CA 或子 CA。
    CSR 使用 CA 簽署的憑證簽署要求。
    SECRET_NAME 保存私密金鑰和已簽署 CA 憑證的 Kubernetes 密鑰名稱。

    替換下列選用變數:

    變數 說明
    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))'
    

    輸出結果會與下列內容相似:

    {
      "lastTransitionTime": "2025-01-27T12:22:59Z",
      "message": "Certificate is issued",
      "observedGeneration": 1,
      "reason": "Issued",
      "status": "True",
      "type": "Ready"
    }
    
  4. 取得憑證密鑰名稱:

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

    輸出內容會顯示包含已簽署憑證的 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 憑證名稱。
    USER_PROJECT_NAMESPACE 使用者專案所在的命名空間名稱。
    CA_NAME CA 的名稱,可以是根 CA 或子 CA。
    SECRET_NAME 保存私密金鑰和已簽署 CA 憑證的 Kubernetes 密鑰名稱。

    替換下列選用變數。您必須在 CertificateRequest 資源的 spec.certificateConfig.subjectConfig 區塊中加入至少一個欄位:

    變數 說明
    COMMON_NAME 憑證的通用名稱。
    ORGANIZATION 憑證上要使用的機構。
    LOCALITY 憑證的所在地。
    STATE 憑證上要使用的州或省。
    COUNTRY 憑證核發國家/地區。
    DNS_NAMES DNSNames 是要設定在憑證上的 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
    
  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))'
    

    輸出結果會與下列內容相似:

    {
      "lastTransitionTime": "2025-01-27T12:22:59Z",
      "message": "Certificate is issued",
      "observedGeneration": 1,
      "reason": "Issued",
      "status": "True",
      "type": "Ready"
    }
    
  4. 取得憑證密鑰名稱:

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

    輸出內容會顯示包含已簽署憑證的 SECRET_NAME

    test-jwk-1
    

列出憑證要求

使用 certificaterequests 參數列出所有 CertificateRequest 資源:

   kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequests

輸出看起來類似以下內容:

   NAMESPACE    NAME               READY   AGE
   foo          cert-req           True    30s