本页面介绍了使用 Certificate Authority Service 请求证书的步骤。
如需在 Google Distributed Cloud (GDC) 气隙环境中建立信任并实现安全通信,请从 Certificate Authority Service 请求启用或停用 ACME 的证书。
准备工作
在申请证书之前,请确保您拥有所需的权限和 kubeconfig 文件。
所需权限
如需获得申请证书所需的权限,请让您的组织 IAM 管理员为您授予 CA Service Certificate Requester (certificate-authority-service-certificate-requester) 角色。如需详细了解角色,请参阅角色定义。
获取 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 模式的情况下创建证书请求,您必须创建 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 证书的名称。 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替换为管理 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))'输出类似于以下内容:
{ "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'输出会显示包含已签名证书的
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 证书的名称。 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 主题的形式提供此值。 将自定义资源应用于 Distributed Cloud 实例:
kubectl apply -f cert-request.yaml --kubeconfig MANAGEMENT_API_SERVER_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))'输出类似于以下内容:
{ "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'输出会显示包含已签名证书的
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