本頁說明如何建立從屬憑證授權單位 (從屬 CA) 的步驟。
子 CA 負責直接向使用者、電腦和裝置等終端實體核發憑證。這些憑證通常由父項 CA (通常是根 CA) 進行加密簽署。信任根 CA 的系統會自動信任子 CA 和子 CA 核發的憑證。
CA 憑證簽署者可以是 CA 服務中建立的其他 CA (例如根 CA),也可以是外部 CA。使用外部 CA 時,CA 服務會產生憑證簽署要求 (CSR),外部 CA 必須簽署這項要求。
事前準備
建立子 CA 前,請確認您具備必要權限和 kubeconfig 檔案。
所需權限
如要取得建立子層憑證授權機構所需的權限,請要求機構 IAM 管理員授予您憑證授權機構服務管理員 (certificate-authority-service-admin) 角色。如要進一步瞭解角色,請參閱角色定義。
取得 kubeconfig 檔案
如要對 Management API 伺服器執行指令,請按照下列步驟操作:
登入並產生 Management API 伺服器的 kubeconfig 檔案 (如果沒有)。
使用 Management API 伺服器的 kubeconfig 檔案路徑,取代這些操作說明中的
MANAGEMENT_API_SERVER_KUBECONFIG。
建立代管子 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 憑證生命週期。 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 憑證生命週期 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 管理 API 伺服器中產生 Sub-CA 的 CSR。您必須下載 CSR 並簽署。簽署完成後,即可將簽署的憑證上傳至 GDC 管理 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檔案中。驗證憑證中的主體別名 (SAN) 擴充功能:
openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject Alternative Name"如果 CA 憑證具有一般名稱 (CN) 而非 SAN,請驗證憑證中的 CN:
openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject: CN"產生
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 無網路連線執行個體中的所有 Certificate Authority Service 資源,請按照下列步驟操作:
使用 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