本文档介绍了使用 Certificate Authority Service (CAS) 请求证书的步骤。
如需在 Google Distributed Cloud (GDC) 网闸隔离配置中建立信任和安全通信,请向 Certificate Authority Service 请求启用或停用 ACME 的证书。
本文档适用于应用运维人员群组中的受众群体,例如在其项目中管理证书生命周期的应用开发者或数据科学家。如需了解详情,请参阅适用于 GDC 网闸隔离配置文档的受众群体。
准备工作
在请求证书之前,您必须请求必要的权限并准备环境。
申请 IAM 角色
如需创建、查看和删除证书请求,请与您的 IAM 组织管理员联系,让其在证书授权机构的项目命名空间中为您授予 CA Service Certificate Requester (certificate-authority-service-certificate-requester) 角色。
准备环境
生成 kubeconfig 文件以配置
kubectl访问权限。
使用启用了 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 或子 CAUSER_PROJECT_NAMESPACE:用户项目所在的命名空间的名称
使用停用了 ACME 模式的 CA 请求证书
如需在停用 ACME 模式的情况下创建证书请求,您必须创建 CertificateRequest 资源并将其应用于 Distributed Cloud 经过网闸隔离实例。有两种方法可以做到这一点:
- 创建
CertificateResource并在资源中添加 CSR。 - 使用 GDC 自动生成的私钥创建
CertificateResource,并以自定义值的形式提供证书配置。
使用 CSR 请求证书
创建
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 用户项目所在的命名空间的名称 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 主题形式提供此值。 将自定义资源应用于 Distributed Cloud 实例:
kubectl apply -f cert-request.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG将
MANAGEMENT_API_SERVER_KUBECONFIG替换为 Management API 服务器的 kubeconfig 文件的路径。验证证书请求是否已准备就绪:
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:用户项目所在的命名空间的名称CERT_REQ_NAME:CertificateRequest资源的名称
输出类似于以下内容:
{ "lastTransitionTime": "2025-01-27T12:22:59Z", "message": "Certificate is issued", "observedGeneration": 1, "reason": "Issued", "status": "True", "type": "Ready" }获取证书 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:用户项目所在的命名空间的名称CERT_REQ_NAME:CertificateRequest资源的名称
输出会显示包含已签名证书的
SECRET_NAME:test-jwk-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 用户项目所在的命名空间的名称 CA_NAME CA 的名称,可以是根 CA 或子 CA SECRET_NAME 包含私钥和签名 CA 证书的 Kubernetes Secret 的名称 替换以下可选变量。您必须至少包含
CertificateRequest资源的spec.certificateConfig.subjectConfig块中的一个字段:变量 说明 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 主题形式提供此值。 将自定义资源应用于 Distributed Cloud 实例:
kubectl apply -f cert-request.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG将
MANAGEMENT_API_SERVER_KUBECONFIG替换为 Management API 服务器的 kubeconfig 文件的路径。验证证书请求是否已准备就绪:
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:用户项目所在的命名空间的名称CERT_REQ_NAME:CertificateRequest资源的名称
输出类似于以下内容:
{ "lastTransitionTime": "2025-01-27T12:22:59Z", "message": "Certificate is issued", "observedGeneration": 1, "reason": "Issued", "status": "True", "type": "Ready" }获取证书 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:用户项目所在的命名空间的名称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:用户项目所在的命名空间的名称
以下示例展示了使用 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 数据库中移除资源。
找到要删除的
CertificateRequest的名称。您可以列出证书请求,以帮助查找名称。删除该
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:用户项目所在的命名空间的名称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 资源。如需调整配额,请与贵组织的基础设施操作员群组中的成员联系。他们可以按照 Runbook PLATAUTH-G2102 中的说明替换配额。
自动清理
您可以启用自动清理功能,以删除过期的 CertificateRequest 资源。此功能会在可配置的宽限期过后移除资源,从而帮助释放资源。宽限期定义了证书到期与 CertificateRequest 资源删除之间的时间长度。
自动清理功能默认处于停用状态。您组织内的基础架构操作员群组的成员可以按照 Runbook PLATAUTH-G2103 中的说明启用此功能并配置宽限期。如果未设置宽限期或宽限期设置为零,则该功能仍处于停用状态。