本页面介绍了如何将客户管理的证书授权机构 (CA) 选项用作 Cloud SQL 实例的服务器 CA 模式。
概览
使用客户管理的 CA 选项时,您可以在 Certificate Authority Service (CA Service) 中设置自己的 CA 池和 CA。选择客户管理的 CA 选项后,您可以设置 CA 层次结构并管理 Cloud SQL 实例的 CA 证书变换。
在使用客户管理的 CA 选项创建 Cloud SQL 实例之前,您需要使用 CA Service 在与实例相同的区域创建一个 CA 池,并在该池中创建至少一个 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 选项,工作流如下所示:
- 为您的 Cloud SQL 项目创建服务账号。
- 在 CA Service 中创建 CA 池。
- 在 CA Service 中创建 CA。
- 创建使用 CA 的 Cloud SQL 实例。创建实例时,您会向服务账号授予使用您创建的 CA 池为服务器证书签名的权限。
准备工作
在使用客户管理的 CA 选项之前,请确保满足以下要求。
所需的角色
如需获得创建 Cloud SQL 专用服务账号所需的权限,请让您的管理员为您向每个项目授予 Service Account Creator (roles/iam.serviceAccountCreator
) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
如需获得创建 CA 池和 CA 所需的权限,请让您的管理员为您授予 CA Service 的 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 Service 中创建 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 池的访问权限
为确保服务账号具有为 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 Service Certificate Requester 服务账号的名称。
在 CA 池中创建 CA
在您创建的 CA 池中至少创建一个 CA。
您可以创建根 CA 或从属 CA。
如需创建根 CA,请按照创建根 CA 中的说明操作。您可以接受 CA 的默认值,但必须确保 CA 处于已启用状态时创建。
配置 CA 密钥大小和算法时,您可以选择任意密钥大小和算法。Cloud SQL 使用 EC P-384 (SHA-384) 椭圆曲线密钥生成服务器证书,但您的 CA 加密密钥不需要与其匹配。如果您创建从属 CA,则需要先创建并配置根 CA。
如需在 CA Service 中创建从属 CA,请按照创建从属 CA 中的说明操作。
如需从外部根 CA 创建从属 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 。 |
请确保您已向为 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 的项目属于同一服务边界。如需了解详情,请参阅服务边界和管理服务边界。 |
您会收到以下
|
检查您的 CA 池和 CA 的配置设置。确保您满足创建 CA 池和在 CA 池中创建 CA 中列出的所有要求。 |
您会收到以下错误消息:
|
这表示 CA Service 存在配额问题。验证项目中 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 实例位于同一区域。 |