使用客户管理的证书授权机构 (CA)

本页介绍了如何将客户管理的证书颁发机构 (CA) 选项用作 Cloud SQL 实例的服务器 CA 模式。

概览

使用客户管理的 CA 选项时,您需要在 Certificate Authority Service (CA Service) 中设置自己的 CA 池和 CA。选择客户管理的 CA 选项后,您可以设置 CA 层次结构,并管理 Cloud SQL 实例的 CA 证书轮替。

在使用客户管理的 CA 选项创建 Cloud SQL 实例之前,您需要在与实例位于同一区域中创建一个 CA 池,并使用 CA Service 在该池中创建至少一个 CA。CA 可以是根 CA从属 CA。您还可以选择在 CA Service 中创建从属 CA,然后将该从属 CA 链接到外部根 CA。创建实例时,您需要指定 CA 池。您的请求会委托给项目专用服务账号,该账号有权使用 CA 池。服务账号会从池中请求 CA,Cloud SQL 会使用该 CA 为实例签署服务器证书。

对于 Cloud SQL 中实例的服务器 CA 模式,您可以从以下三个选项中进行选择:

  • 每个实例的内部 CA
  • Google 管理的共享 CA
  • 客户管理的 CA

如果您出于合规性方面的原因需要管理自己的 CA,则可以选择“客户管理的 CA”选项。如需详细了解如何使用其他选项,请参阅使用 SSL/TLS 证书进行授权

工作流

如需使用客户管理的 CA 选项,请按以下工作流程操作:

  1. 为您的 Cloud SQL 项目创建一个服务账号。
  2. 在 CA 服务中创建 CA 池。
  3. 在 CA 服务中创建 CA。
  4. 创建使用 CA 的 Cloud SQL 实例。创建实例时,您可以将使用您创建的 CA 池为服务器证书签名的权限委托给服务账号。

准备工作

在使用客户管理的 CA 选项之前,请确保您满足以下要求。

所需的角色

如需获得创建 Cloud SQL 专用服务账号所需的权限,请让管理员为您授予每个项目的 Service Account Creator (roles/iam.serviceAccountCreator) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

如需获得创建 CA 池和 CA 所需的权限,请让管理员向您授予 CA 服务的 CA Service Operation Manager(roles/privateca.caManager) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

创建特定于项目的服务账号

在您计划创建 Cloud SQL 实例的项目中,创建一个专用服务账号,用于处理为 Cloud SQL 实例创建和签署服务器证书的请求。

gcloud

运行以下命令,为您的 Cloud SQL 项目创建服务账号:

gcloud beta services identity create \
  --service=sqladmin.googleapis.com \
  --project=PROJECT_ID

PROJECT_ID 替换为您计划创建 Cloud SQL 实例的项目的 ID。

该命令会在项目中创建一个名为 service-PROJECT_ID@gcp-sa-cloud-sql.iam.gserviceaccount.com 的服务账号。记下 CA Service Certificate Requester 服务账号名称。

创建 CA 池

在 CA 服务中创建 CA 池。

您可以在计划创建 Cloud SQL 实例的项目中创建 CA 池,也可以在其他项目中创建 CA 池。不过,如果您在其他项目中创建 CA 池,则 VPC Service Controls 可能会阻止您创建任何 Cloud SQL 实例,具体取决于组织政策。如需解决此问题,请确保托管 CA 池和 CA 的项目以及托管 Cloud SQL 的项目属于同一服务边界。如需了解详情,请参阅服务边界管理服务边界

如需创建 CA 池,请按照创建 CA 池中的说明操作。您可以接受 CA 池的默认值,并使用以下必需的配置设置:

  • 在您计划创建 Cloud SQL 实例的同一区域中创建 CA 池。如需查看 Cloud SQL 支持的区域列表,请参阅区域
  • 允许基于配置的证书请求。
  • 允许在主题备用名称 (SAN) 中使用 DNS 名称。配置 CA 池的身份限制条件时,请勿对 DNS 域名的格式设置任何限制,以免与 Cloud SQL 可能添加到 SAN 的内容冲突。
  • 如果您为 CA 池配置了身份限制条件,请确保允许在 SAN 中使用 IP 地址格式。

为服务账号提供对 CA 池的访问权限

为确保该服务账号有权为您的 Cloud SQL 实例请求和签署证书,请向您创建的 CA 池的服务账号授予以下角色:

  • roles/privateca.certificateRequester

gcloud

运行 gcloud privateca pools 命令,向服务账号授予对 CA 池的访问权限:

gcloud privateca pools add-iam-policy-binding CA_POOL_ID \
  --project=PROJECT_ID \
  --location=REGION \
  --member serviceAccount:SERVICE_ACCOUNT_NAME \
  --role=roles/privateca.certificateRequester

进行以下替换:

  • CA_POOL_ID 替换为您创建的 CA 池的 ID。
  • PROJECT_ID 替换为您计划创建 Cloud SQL 实例的项目的 ID。
  • REGION 替换为您创建 CA 池的区域。
  • SERVICE_ACCOUNT_NAME 替换为您之前为项目创建的 CA 服务证书请求方服务账号的名称。

在 CA 池中创建 CA

在您创建的 CA 池中至少创建一个 CA。

您可以创建根 CA 或从属 CA。

如需创建根 CA,请按照创建根 CA 中的说明操作。您可以接受 CA 的默认值,但请确保在启用状态下创建 CA。

配置 CA 密钥大小和算法时,您可以选择任何密钥大小和算法。Cloud SQL 使用 EC P-256 (SHA 256) 椭圆曲线密钥生成服务器证书,但您的 CA 加密密钥不必匹配。

如果您要创建子 CA,则需要先创建并配置根 CA。

创建 Cloud SQL 实例

如需创建使用客户管理的 CA 选项的 Cloud SQL 实例,请执行以下操作。

控制台

预览期间,您无法使用 Google Cloud 控制台创建使用客户管理的 CA 选项的实例。

请改用 gcloud beta sql instances create 命令。

gcloud

gcloud beta sql instances create "INSTANCE_NAME" \
  --project=PROJECT_ID \
  --region=REGION \
  --server-ca-mode=CUSTOMER_MANAGED_CAS_CA \
  --server-ca-pool=projects/PROJECT_ID_CAS/locations/REGION/caPools/CA_POOL_ID

进行以下替换:

  • INSTANCE_NAME 替换为您要创建的 Cloud SQL 实例的名称。
  • PROJECT_ID 替换为您计划创建 Cloud SQL 实例的项目的 ID。
  • PROJECT_ID_CAS 替换为您创建 CA_POOL_ID 的项目的 ID。此项目可能与您要创建 Cloud SQL 实例的项目相同,也可能不同。
  • REGION 替换为您创建 CA 池的区域。您必须在 CA 池所在的区域中创建实例。
  • CA_POOL_ID 替换为您创建的 CA 池的 ID。

REST

如需创建使用客户管理的 CA 选项的 Cloud SQL 实例,请使用 instances.insert 方法并指定以下属性:

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID 您计划创建 Cloud SQL 实例的项目的 ID。
  • PROJECT_ID_CAS 是您创建 CA_POOL_ID 的项目的 ID。此项目可能与您要创建 Cloud SQL 实例的项目相同,也可能不同。
  • INSTANCE_ID 您要创建的 Cloud SQL 实例的名称。
  • REGION 是您创建 CA 池的区域。您必须在 CA 池所在的区域中创建实例。
  • CA_POOL_ID 替换为您创建的 CA 池的 ID。

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances

请求 JSON 正文:

{
  "name":"INSTANCE_ID",
  "region":"REGION",
  "databaseVersion": "DATABASE_VERSION",
  "settings":{
     "ipConfiguration":
      {
         "serverCaPool": "projects/PROJECT_ID_CAS/locations/REGION/caPools/CA_POOL_ID",
         "serverCaMode": "CUSTOMER_MANAGED_CAS_CA"
      }
   }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2025-01-16T02:32:12.281Z",
  "operationType": "UPDATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID_CSQL/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

问题排查

问题 问题排查

您收到以下错误消息:

PERMISSION_DENIED: Permission privateca.certificates.create denied on CA_POOL_ID
确保您已向为 Cloud SQL 项目创建的服务账号授予 roles/privateca.certificateRequester 角色。 如需了解详情,请参阅向服务账号授予对 CA 池的访问权限

您收到以下错误消息:

PERMISSION_DENIED: Request is prohibited by organization's policy vpcServiceControlsUniqueIdentifier VPC_SERVICE_CONTROLS_UNIQUE_IDENTIFIER.
请务必配置 VPC Service Controls,以便托管 CA Service CA 池和 CA 的项目以及托管 Cloud SQL 的项目属于同一服务边界。 如需了解详情,请参阅服务边界管理服务边界

您收到以下某条 INVALID ARGUMENT 错误消息:

  • Public key algorithm is not permitted by the CaPool's issuance policy.
  • This CaPool's issuance policy does not permit passthrough subjects and/or subject alternative names, and thus can only be used with the REFLECTED_SPIFFE subject mode.
  • Config issuance mode is not permitted by the CaPool's issuance policy.

检查您的 CA 池和 CA 的配置设置。 确保您满足创建 CA 池在 CA 池中创建 CA中列出的所有要求。

您收到以下错误消息:

RESOURCE_EXHAUSTED

这表示 CA 服务存在配额问题。验证项目中的 CA Service 配额。检查您是否可能会在 Cloud SQL 之外使用 CA 池中的请求。 如需了解详情,请参阅配额和限制

您收到以下错误消息:

NOT FOUND: parent resource CA_POOL_ID not found.
检查您在创建 Cloud SQL 实例时指定的 CA 池的项目 ID、位置和名称。确保没有拼写错误。

您收到以下错误消息:

FAILED_PRECONDITION: There are no enabled CAs in the CaPool. Please ensure that there is at least one enabled Certificate Authority to issue a certificate.
确保您已在创建 Cloud SQL 实例时指定的 CA 池中创建至少一个 CA,并且该 CA 处于启用状态。

您收到以下错误消息:

FAILED_PRECONDITION: Per-Product Per-Project Service Account (P4 SA) SERVICE_ACCOUNT_NAME not found for project PROJECT_ID.
确保您已为 Cloud SQL 项目创建服务账号。如需了解详情,请参阅创建项目专用服务账号

您收到以下错误消息:

INVALID ARGUMENT: Invalid format for server CA pool.

请确保您指定的 CA 池格式正确无误:

projects/PROJECT_ID/locations/REGION/caPools/CA_POOL_ID

您收到以下错误消息:

INVALID ARGUMENT: The instance's server CA pool must be in the same region as the instance.

确保 CA 池与您要创建的 Cloud SQL 实例位于同一区域。