建立從屬憑證授權單位

本文說明建立從屬憑證授權單位 (從屬 CA) 的步驟。

子 CA 負責直接向使用者、電腦和裝置等終端實體核發憑證。這些憑證由上層 CA (通常是根 CA) 進行加密簽署。信任根 CA 的系統會自動信任子 CA 及其核發的憑證。

CA 憑證簽署者可以是 CA 服務中建立的其他 CA (例如根 CA),也可以是外部 CA。如果是外部 CA,CA 服務會產生憑證簽署要求 (CSR),並由外部 CA 簽署。

本文適用於應用程式營運商群組中的對象,例如在專案中管理憑證生命週期的應用程式開發人員或數據資料學家。詳情請參閱「GDC 實體隔離方案說明文件的目標對象」。

事前準備

您必須先要求必要權限並準備環境,才能建立子 CA。

要求 IAM 角色

如要建立、更新及刪除憑證授權單位資源,請與 IAM 機構組織管理員聯絡,要求取得憑證授權單位專案命名空間中的憑證授權單位服務管理員 (certificate-authority-service-admin) 角色。

準備環境

建立代管子 CA

如果是代管從屬 CA,CA 憑證的簽署者是在 CA 服務中建立的其他 CA (根 CA)。

如要建立代管子 CA,請將自訂資源套用至 Distributed Cloud Appliance 執行個體。

  1. 建立 CertificateAuthority 資源,並儲存為名為 subca.yaml 的 YAML 檔案:

    apiVersion: pki.security.gdc.goog/v1
    kind: CertificateAuthority
    metadata:
      Name: SUB_CA_NAME
      namespace: USER_PROJECT_NAMESPACE
    spec:
      caProfile:
        commonName: COMMON_NAME
        duration: DURATION
        renewBefore: RENEW_BEFORE
        organizations:
        - ORGANIZATIONS
        organizationalUnits:
        - ORGANIZATIONAL_UNITS
        countries:
        - COUNTRIES
        localities:
        - LOCALITIES
        provinces:
        - PROVINCES
        streetAddresses:
        - STREET_ADDRESSES
        postalCodes:
        - POSTAL_CODES
      caCertificate:
        managedSubCA:
          certificateAuthorityRef:
            name: ROOT_CA_NAME
            namespace: USER_PROJECT_NAMESPACE
      certificateProfile:
        keyUsage:
          - digitalSignature
          - keyCertSign
          - crlSign
        extendedKeyUsage:
          - EXTENDED_KEY_USAGE
      secretConfig:
        secretName: SECRET_NAME
        privateKeyConfig:
          algorithm: KEY_ALGORITHM
          size: KEY_SIZE
      acme:
        enabled: ACME_ENABLED
    

    請替換下列變數:

    變數 說明
    SUB_CA_NAME 子 CA 的名稱。
    USER_PROJECT_NAMESPACE 使用者專案所在的命名空間名稱。
    COMMON_NAME CA 憑證的一般名稱。
    DURATION CA 憑證要求的效期。請以小時為單位指定時間長度 (例如 1000h)。不支援天數 (d) 或年數 (y) 等單位。
    ROOT_CA_NAME 根 CA 的名稱。
    SECRET_NAME Kubernetes Secret 的名稱,其中包含私密金鑰和已簽署的 CA 憑證。

    以下變數為選用值:

    變數 說明
    RENEW_BEFORE CA 憑證到期前的輪替時間。
    ORGANIZATIONS 要用於憑證的機構。
    ORGANIZATIONAL_UNITS 憑證使用的組織單位。
    COUNTRIES 憑證適用的國家/地區。
    LOCALITIES 憑證上使用的城市。
    PROVINCES 憑證上使用的州或省。
    STREET_ADDRESSES 憑證上使用的街道地址。
    POSTAL_CODES 憑證上使用的郵遞區號。
    EXTENDED_KEY_USAGE 憑證的擴充金鑰使用方式。如有提供,允許的值為 serverAuth 和 clientAuth。
    KEY_ALGORITHYM 這個憑證使用的私密金鑰演算法。允許的值為 RSA、Ed25519 或 ECDSA。如未提供大小,ECDSA 的預設值為 256,RSA 則為 2048。Ed25519 會忽略金鑰大小。
    KEY_SIZE 這個憑證的私密金鑰大小 (以位元為單位) 取決於演算法。RSA 允許 2048、3072、4096 或 8192 (預設為 2048)。ECDSA 允許 256、384 或 521 (預設為 256)。Ed25519 會忽略大小。
    ACME_ENABLED 如果設為 true,CA 會在 ACME 模式下執行,並輸出 ACME 伺服器網址。接著,您可以使用 ACME 用戶端和通訊協定管理憑證。
  2. 將自訂資源套用至 Distributed Cloud 執行個體:

    kubectl apply -f subca.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
    

    將 MANAGEMENT_API_SERVER_KUBECONFIG 替換為 Management API 伺服器的 kubeconfig 檔案路徑。

  3. 確認子 CA 是否就緒。憑證授權單位約需 40 分鐘才能準備就緒:

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

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

    {
      "lastTransitionTime": "2025-01-24T17:09:29Z",
      "message": "CA reconciled",
      "observedGeneration": 2,
      "reason": "Ready",
      "status": "True",
      "type": "Ready"
    }
    

從外部 CA 建立子 CA

這個子 CA 支援使用外部或使用者管理的 CA 簽署分葉憑證。系統會產生 CSR 供使用者簽署。

  1. 建立 CertificateAuthority 資源,並儲存為名為 subca-external.yaml 的 YAML 檔案:

    apiVersion: pki.security.gdc.goog/v1
    kind: CertificateAuthority
    metadata:
      Name: SUB_CA_NAME
      namespace: USER_PROJECT_NAMESPACE
    spec:
      caProfile:
        commonName: COMMON_NAME
        duration: DURATION
        renewBefore: RENEW_BEFORE
        organizations:
        - ORGANIZATION
        organizationalUnits:
        - ORGANIZATIONAL_UNITS
        countries:
        - COUNTRIES
        localities:
        - LOCALITIES
        provinces:
        - PROVINCES
        streetAddresses:
        - STREET_ADDRESSES
        postalCodes:
        - POSTAL_CODES
      caCertificate:
        externalCA: {}
      certificateProfile:
        keyUsage:
          - digitalSignature
          - keyCertSign
          - crlSign
        extendedKeyUsage:
          - EXTENDED_KEY_USAGE
      secretConfig:
        secretName: SECRET_NAME
        privateKeyConfig:
          algorithm: KEY_ALGORITHM
          size: KEY_SIZE
      acme:
        enabled: ACME_ENABLED
    

    請替換下列變數:

    變數 說明
    SUB_CA_NAME 子 CA 的名稱。
    USER_PROJECT_NAMESPACE 要匯入映像檔的專案 ID。
    COMMON_NAME CA 憑證的一般名稱。
    DURATION CA 憑證要求的效期。請以小時為單位指定時間長度 (例如 1000h)。不支援天數 (d) 或年數 (y) 等單位。
    SECRET_NAME Kubernetes 密鑰的名稱,其中包含私密金鑰和已簽署的 CA 憑證。

    以下變數為選用值:

    變數 說明
    RENEW_BEFORE CA 憑證到期前的輪替時間。
    ORGANIZATION 憑證上使用的機構。
    ORGANIZATIONAL_UNITS 憑證使用的組織單位。
    COUNTRIES 憑證適用的國家/地區。
    LOCALITIES 憑證上使用的城市。
    PROVINCES 憑證上使用的州或省。
    STREET_ADDRESSES 憑證上使用的街道地址。
    POSTAL_CODES 憑證上使用的郵遞區號。
    EXTENDED_KEY_USAGE 憑證的擴充金鑰使用方式。如有提供,允許的值為 serverAuth 和 clientAuth。
    KEY_ALGORITHYM 這個憑證使用的私密金鑰演算法。允許的值為 RSA、Ed25519 或 ECDSA。如未提供大小,ECDSA 的預設值為 256,RSA 的預設值為 2048。系統會忽略 Ed25519 的金鑰大小。
    KEY_SIZE 這個憑證的私密金鑰大小 (以位元為單位) 取決於演算法。RSA 允許 2048、3072、4096 或 8192 (預設為 2048)。ECDSA 允許 256、384 或 521 (預設為 256)。Ed25519 會忽略大小。
    ACME_ENABLED 如果設為 true,CA 會在 ACME 模式下執行,並輸出 ACME 伺服器網址。接著,您可以使用 ACME 用戶端和通訊協定管理憑證。
  2. 將自訂資源套用至 Distributed Cloud 執行個體:

    kubectl apply -f subca-external.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
    
  3. 系統會在 GDC Management API 伺服器中,為子 CA 產生 CSR。您必須下載 CSR 並簽署。簽署完成後,即可將簽署的憑證上傳至 GDC Management API 伺服器。

  4. 從 Distributed Cloud 環境收集憑證簽署要求 (CSR):

    kubectl get certificateauthorities SUB_CA_NAME -n USER_PROJECT_NAMESPACE -ojson | jq -j '"echo ", .status.externalCA.csr, " | base64 -d > ","sub_ca.csr\n"' | bash
    

    這個指令會在目前目錄中產生名為 sub_ca.csr 的 CSR 檔案。這個檔案包含 X.509 CA 憑證的 CSR。

  5. 使用客戶的根 CA,要求 sub_ca.csr 檔案的已簽署 CA 憑證。

  6. 如要核准憑證簽署要求,您必須取得由客戶根 CA 簽署的 CA 憑證。將憑證儲存在目前目錄的 sub_ca.crt 檔案中。

  7. 視情況取得客戶的根 CA 憑證,並儲存在目前目錄的 ca.crt 檔案中。

  8. 驗證 CA 憑證的一般名稱 (CN):

    openssl x509 -noout -subject -in sub_ca.crt
    

    如果您的設定需要主體別名 (SAN) 擴充功能,請驗證憑證中的 SAN 擴充功能:

    openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject Alternative Name"
    
  9. 產生 spec 來修補 CertificateAuthority 資源:

    echo "spec:
      caCertificate:
        externalCA:
          signedCertificate:
            certificate: $(base64 -w0 SUB_CA_NAME.crt)
            ca: $(base64 -w0 ca.crt)" > patch.txt
    

    patch.txt 檔案中的內容大致如下:

    spec:
      caCertificate:
        externalCA:
          signedCertificate:
            certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURSekNDQ…
            ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQ…
    
  10. 編輯 CertificateAuthority 資源的 spec 欄位:

    kubectl patch certificateauthority SUB_CA_NAME -n USER_PROJECT_NAMESPACE--patch-file patch.txt --type='merge'
    
  11. 確認自備 (BYO) 子 CA 是否已準備就緒。CA 通常需要約 40 分鐘才能準備就緒:

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

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

    {
      "lastTransitionTime": "2024-04-30T22:10:50Z",
      "message": "Certificate authority is ready for use",
      "observedGeneration": 3,
      "reason": "Ready",
      "status": "True",
      "type": "Ready"
    }
    
  12. 驗證已簽署 CA 憑證的到期日:

    kubectl -n USER_PROJECT_NAMESPACE get secret SECRET_NAME -ojson | jq -j '"echo ", .metadata.name, " $(echo ", .data["tls.crt"], "| base64 -d | openssl x509 -enddate -noout)\n"' | bash
    

列出 CA

如要列出 Distributed Cloud 實體隔離執行個體中的所有憑證授權單位服務資源,請按照下列步驟操作:

使用 certificateauthorities 參數列出所有 CertificateAuthority 資源:

   kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificateauthorities

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

   NAMESPACE    NAME              READY   REASON   AGE
   foo          root-ca           True    Ready    7h24m
   foo          sub-ca            True    Ready    7h24m