本文說明如何建立從屬憑證授權單位 (從屬 CA)。
子 CA 負責直接向使用者、電腦和裝置等實體核發憑證。這些憑證通常由父項 CA (通常是根 CA) 進行加密簽署。信任根 CA 的系統會自動信任子 CA 和子 CA 核發的憑證。
CA 憑證簽署者可以是 CA 服務中建立的其他 CA (例如根 CA),也可以是外部 CA。使用外部 CA 時,CA 服務會產生憑證簽署要求 (CSR),必須由外部 CA 簽署。
本文適用於應用程式運算子群組中的對象,例如應用程式開發人員或資料科學家,他們負責管理專案中的憑證生命週期。詳情請參閱 GDC 氣隙環境適用的目標對象說明文件。
事前準備
建立子 CA 前,您必須先要求必要權限並準備環境。
要求 IAM 角色
如要建立、更新及刪除憑證授權單位資源,請與機構 IAM 管理員聯絡,要求在憑證授權單位的專案命名空間中,取得「憑證授權單位服務管理員」(certificate-authority-service-admin) 角色。
準備環境
產生 kubeconfig 檔案,設定
kubectl存取權。
建立代管子 CA
如果是受管理子 CA,CA 憑證的簽署者是 CA 服務中建立的另一個 CA (根 CA)。
如要建立代管子 CA,請將自訂資源套用至 Distributed Cloud Appliance 執行個體。
建立
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 儲存私密金鑰和已簽署 CA 憑證的 Kubernetes 密鑰名稱。 下列變數為選用值:
變數 說明 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 用戶端和通訊協定管理憑證。將自訂資源套用至 Distributed Cloud 執行個體:
kubectl apply -f subca.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG將
MANAGEMENT_API_SERVER_KUBECONFIG替換為 Management API 伺服器的 kubeconfig 檔案路徑。確認子 CA 是否已準備就緒。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 供使用者簽署。
建立
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 儲存私密金鑰和已簽署 CA 憑證的 Kubernetes 密鑰名稱。 下列變數為選用值:
變數 說明 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 用戶端和通訊協定管理憑證。將自訂資源套用至 Distributed Cloud 執行個體:
kubectl apply -f subca-external.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG系統會在 GDC Management API 伺服器中產生 Sub-CA 的 CSR。您必須下載 CSR 並簽署。簽署完成後,即可將簽署的憑證上傳至 GDC Management API 伺服器。
從 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.509CA 憑證的 CSR。使用客戶的根 CA,為
sub_ca.csr檔案要求簽署的 CA 憑證。如果憑證簽署要求獲得核准,您必須取得由客戶根 CA 簽署的 CA 憑證。將憑證儲存在目前目錄的
sub_ca.crt檔案中。如有需要,請取得客戶的根 CA 憑證,並儲存在目前目錄的
ca.crt檔案中。驗證 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"產生
spec,以修補CertificateAuthority資源:echo "spec: caCertificate: externalCA: signedCertificate: certificate: $(base64 -w0 SUB_CA_NAME.crt) ca: $(base64 -w0 ca.crt)" > patch.txtpatch.txt檔案中的內容如下所示:spec: caCertificate: externalCA: signedCertificate: certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURSekNDQ… ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQ…編輯
CertificateAuthority資源的spec欄位:kubectl patch certificateauthority SUB_CA_NAME -n USER_PROJECT_NAMESPACE--patch-file patch.txt --type='merge'確認自備 (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" }確認已簽署 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