请求证书

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

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

准备工作

如需获得申请证书所需的权限,请让组织 IAM 管理员向您授予 Certificate Authority Service Admin (certificate-authority-service-admin) 角色。

获取 kubeconfig 文件

如需针对管理 API 服务器运行命令,请确保您拥有以下资源:

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

使用管理 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 模式的情况下创建证书请求,您必须在 Distributed Cloud 空气隔离实例中创建并应用 CertificateRequest 资源。有两种方法可以做到这一点:

  • 创建 CertificateResource,并在资源中添加 CSR。
  • 使用 GDC 自动生成的私钥创建 CertificateResource,并以自定义值形式提供证书配置。

使用 CSR 请求证书

  1. 创建 CertificateRequest 资源并将其另存为名为 cert-request.yaml 的 YAML 文件。使用您的私钥创建证书签名请求 (CSR),并将其添加到您的资源中:

    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
      signedCertificateSecret: SECRET_NAME
    

    执行以下变量替换操作:

    变量 说明
    CERT_REQ_NAME 证书的名称。
    USER_PROJECT_NAMESPACE 用户项目所在的命名空间的名称。
    CA_NAME CA 的名称,可以是根 CA 或子 CA。
    CSR 要使用 CA 签名的证书签名请求。
    SECRET_NAME 包含私钥和已签名的 CA 证书的 Kubernetes Secret 的名称。
  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 文件。填充证书的所选值:

    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
      signedCertificateSecret: SECRET_NAME
    

    COMMON_NAME 替换为证书的通用名称。

    替换以下可选变量。您必须在 CertificateRequest 资源中包含至少一个以下值:

    变量 说明
    ORGANIZATION 证书上要使用的组织。
    LOCALITY 证书的地点。
    STATE 证书上要使用的州或省/直辖市/自治区。
    COUNTRY 证书的签发国家/地区。
    DNS_NAMES DNSNames 是要设置在证书上的 dNSName subjectAltNames 列表。
    IP_ADDRESS 要设置在证书上的 ipAddress subjectAltNames 列表。
    RFC822_NAMES 要设置在证书上的 rfc822Name subjectAltNames 列表。
    URIS 要设置在证书上的 uniformResourceIdentifier subjectAltNames 的列表。
  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