请求证书

本文档介绍了使用证书授权机构服务 (CAS) 请求证书的步骤。

如需在 Google Distributed Cloud (GDC) 网闸隔离配置中建立信任并确保通信安全,请从 Certificate Authority Service 请求启用或停用 ACME 的证书。

本文档面向应用运维人员组内的受众,例如应用开发者或数据科学家,他们负责管理项目中的证书生命周期。如需了解详情,请参阅 GDC 网闸隔离配置文档的受众

准备工作

您必须先请求必要的权限并准备好环境,然后才能请求证书。

请求 IAM 角色

如需创建、查看和删除证书请求,请与组织 IAM 管理员联系,以在证书授权机构的项目命名空间中向您授予 CA 服务证书请求者 (certificate-authority-service-certificate-requester) 角色。

准备环境

使用启用了 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:用户项目所在的命名空间的名称

使用停用了 ACME 模式的 CA 请求证书

如需创建停用了 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 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 主题的形式提供此值。
  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))'
    

    替换以下内容:

    • MANAGEMENT_API_SERVER_KUBECONFIG:Management API 服务器的 kubeconfig 文件的路径
    • USER_PROJECT_NAMESPACE:用户项目所在的命名空间的名称
    • CERT_REQ_NAMECertificateRequest 资源的名称

    输出类似于以下内容:

    {
      "lastTransitionTime": "2025-01-27T12:22:59Z",
      "message": "Certificate is issued",
      "observedGeneration": 1,
      "reason": "Issued",
      "status": "True",
      "type": "Ready"
    }
    
  4. 获取证书 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_NAMECertificateRequest 资源的名称

    输出显示了包含已签名证书的 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 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 主题的形式提供此值。
  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))'
    

    替换以下内容:

    • MANAGEMENT_API_SERVER_KUBECONFIG:Management API 服务器的 kubeconfig 文件的路径
    • USER_PROJECT_NAMESPACE:用户项目所在的命名空间的名称
    • CERT_REQ_NAMECertificateRequest 资源的名称

    输出类似于以下内容:

    {
      "lastTransitionTime": "2025-01-27T12:22:59Z",
      "message": "Certificate is issued",
      "observedGeneration": 1,
      "reason": "Issued",
      "status": "True",
      "type": "Ready"
    }
    
  4. 获取证书 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_NAMECertificateRequest 资源的名称

    输出显示了包含已签名证书的 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 数据库中移除该资源。

  1. 找到您要删除的 CertificateRequest 的名称。您可以 列出证书请求,以帮助查找名称。

  2. 删除 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_NAMECertificateRequest 资源的名称

证书请求限制和清理

为了帮助维护系统稳定性并防止资源使用率过高,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 中的说明启用此功能并配置 宽限期。 如果未设置宽限期或将其设置为零,则此功能仍处于停用状态。