请求证书

本页面介绍了使用 Certificate Authority Service 请求证书的步骤。

如需在 Google Distributed Cloud (GDC) 气隙环境中建立信任并实现安全通信,请从 Certificate Authority Service 请求启用或停用 ACME 的证书。

准备工作

在申请证书之前,请确保您拥有所需的权限和 kubeconfig 文件。

所需权限

如需获得申请证书所需的权限,请让您的组织 IAM 管理员为您授予 CA Service Certificate Requester (certificate-authority-service-certificate-requester) 角色。如需详细了解角色,请参阅角色定义

获取 kubeconfig 文件

如需针对管理 API 服务器运行命令,请执行以下操作:

  1. 登录并生成管理 API 服务器的 kubeconfig 文件(如果您还没有)。

  2. 使用管理 API 服务器的 kubeconfig 文件路径替换这些说明中的 MANAGEMENT_API_SERVER_KUBECONFIG

使用启用了 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 证书的名称。
    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 替换为管理 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))'
    

    输出类似于以下内容:

    {
      "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'
    

    输出会显示包含已签名证书的 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 证书的名称。
    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 DNSNames 是要设置在证书上的 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
    
  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))'
    

    输出类似于以下内容:

    {
      "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'
    

    输出会显示包含已签名证书的 SECRET_NAME

    test-jwk-1
    

列出证书请求

使用 certificaterequests 参数列出所有 CertificateRequest 资源:

   kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificaterequests

输出类似于以下内容:

   NAMESPACE    NAME               READY   AGE
   foo          cert-req           True    30s