创建 CA 池

本页面介绍如何创建证书授权机构 (CA) 池。

CA 池是具有通用证书颁发政策和 Identity and Access Management (IAM) 政策的多个 CA 的集合。CA 池可简化 CA 轮替管理,并可实现更高的总每秒有效查询数 (QPS)。

您必须先创建 CA 池,然后才能使用 Certificate Authority Service 创建 CA。 如需了解详情,请参阅 CA 池概览

准备工作

确保您拥有 CA Service Operation Manager (roles/privateca.caManager) IAM 角色。如需了解如何向主帐号授予 IAM,请参阅授予单个角色

确定 CA 池的设置

本部分介绍了 CA 池的设置,并提供了有关确定设置的建议。

永久 CA 池设置

创建 CA 池后,以下 CA 池设置将无法更改。

位置

指定 CA 池的位置。CA 池存储在单个 Google Cloud 位置。我们建议您在要使用 CA 池所在的位置或附近创建 CA 池。

如需查看受支持位置的完整列表,请参阅位置

层级

选择是使用 DevOps 还是企业层级创建 CA 池。此选择会影响 CA 服务是否保留创建的证书、以后是否可以撤消创建的证书,以及从 CA 池中的 CA 创建证书的最大速率。如需了解详情,请参阅选择操作层级

可选的 CA 池设置

证书颁发政策

CA 池可以具有证书颁发政策。此颁发政策对允许 CA 池中的 CA 颁发的证书进行了限制。您可以在创建 CA 池后更新 CA 池的颁发政策。如需了解详情,请参阅模板和发布政策概览

如需详细了解如何配置证书颁发政策,请参阅向 CA 池添加证书颁发政策

发布选项

您可以配置 CA 池,以为每个 CA 发布 CA 证书。颁发证书时,此 CA 证书的网址作为授权信息访问 (AIA) 扩展包含在证书中。

可以允许企业层级 CA 池中的 CA 将证书吊销列表 (CRL) 发布到关联的 Cloud Storage 存储桶。颁发证书时,此 CRL 的网址将作为 CRL 分发点 (CDP) 扩展程序包含在证书中。如果没有 CDP 扩展,就无法在证书中找到 CRL。如需了解详情,请参阅撤消证书

您还可以选择已发布的 CA 证书和 CRL 的编码格式。支持的编码格式包括保密增强邮件 (PEM) 和唯一编码规则 (DER)。如果未指定编码格式,系统将使用 PEM。

如果您使用 Google Cloud CLI 或 Google Cloud 控制台创建 CA 池,则 CA Service 会默认启用这些发布选项。如需了解详情,请参阅为 CA 池中的 CA 停用 CA 证书和 CRL 发布

创建 CA 池

如需创建 CA 池,请按照以下说明操作:

控制台

为 CA 池选择名称

  1. 转到 Google Cloud 控制台中的 Certificate Authority Service 页面。

    转到 Certificate Authority Service

  2. 点击 CA 池管理员

  3. 点击创建池

  4. 为区域添加唯一的 CA 池名称。

  5. 区域字段的下拉列表中选择一个区域。如需了解详情,请参阅选择最佳位置

  6. 选择企业或 DevOps 层级。如需了解详情,请参阅选择操作层级

  7. 点击下一步

配置允许的密钥算法和大小

借助 CA Service,您可以为支持 CA 池中的 CA 的 Cloud KMS 密钥选择签名算法。默认情况下,系统允许使用所有密钥算法。

如需限制 CA 池颁发的证书中允许的密钥,请执行以下操作。这是一个可选过程。

  1. 点击切换开关。
  2. 点击添加一项
  3. 类型列表中,选择密钥类型。

    如果要使用 RSA 密钥,请执行以下操作:

    1. 可选:添加最小模数大小(以位为单位)。
    2. 可选:添加最大模数大小(以位为单位)。
    3. 点击完成

    如果要使用椭圆曲线键,请执行以下操作:

    1. 可选:在椭圆曲线类型列表中,选择椭圆曲线类型。
    2. 点击完成
  4. 如需添加其他允许的键,请点击添加一项,然后重复第 2 步。

  5. 点击下一步

配置证书请求方法

如需对证书请求者可用于从 CA 池请求证书的方法施加限制,请执行以下操作:

  1. 可选:要限制基于 CSR 的证书请求,请点击切换开关。
  2. 可选:如需限制基于配置的证书请求,请点击切换开关。

配置发布选项

如需配置发布选项,请执行以下操作:

  1. 可选:如需禁止将 CA 证书发布到 CA 池中 CA 的 Cloud Storage 存储桶,请点击切换开关。
  2. 可选:如需禁止将 CRL 发布到 CA 池中 CA 的 Cloud Storage 存储桶,请点击切换开关。
  3. 点击该菜单可为已发布的 CA 证书和 CRL 选择编码格式。

    为 CA 池中的 CA 配置 CA 证书和 CRL 的发布选项。

  4. 点击下一步

配置身份限制条件

如需针对 CA 池发出的证书中的主题和 SAN 配置限制条件,请执行以下操作:

  1. 可选:如需禁止传递证书请求中的主题,请点击切换开关。
  2. 可选:如需禁止传递证书请求中的主题备用名称,请点击切换开关。
  3. 可选:添加通用表达式语言 (CEL) 表达式以对证书主题施加限制。如需了解详情,请参阅使用 CEL
  4. 点击 Next
配置扩展程序限制条件

如需禁止将证书请求中的所有扩展包含在已颁发的证书中,请点击切换开关。

点击切换开关后,您会看到已知证书扩展字段,您可以使用该字段选择证书扩展。如需选择证书扩展,请执行以下操作:

  1. 可选:点击已知证书扩展字段,然后从菜单中清除不需要的扩展。
  2. 可选:在自定义扩展程序字段中,为要包含在 CA 池颁发的证书中的扩展程序添加对象标识符。
配置基准值

如需在从 CA 池颁发的证书中配置基准值,请执行以下操作:

  1. 点击切换开关。
  2. 点击配置基准值
定义基本密钥用法

您可以使用此设置来配置证书中包含的密钥的使用方式。密钥使用选项包括密钥加密、数据加密、证书签名、CRL 签名等。

如需了解详情,请参阅密钥用法

如需定义基本密钥用法,请执行以下操作:

  1. 可选:如果您想指定证书的基本密钥用途,请在显示的窗口中点击切换开关。
  2. 选中密钥使用方式所对应的复选框。
  3. 选择密钥的大致用途。
  4. 点击 Next
定义扩展的密钥用法

您可以使用此设置来选择更精细的场景,以便使用证书中包含的密钥。具体选项包括服务器身份验证、客户端身份验证、代码签名、电子邮件保护等。

扩展的密钥用途是使用对象标识符 (OID) 定义的。如果您未配置扩展密钥用法,则系统将允许所有密钥使用场景。

如需了解详情,请参阅扩展的密钥用法

如需定义扩展的密钥用途,请执行以下操作:

  1. 可选:如需为 CA 池颁发的证书指定扩展密钥用途,请点击切换开关。
  2. 选中扩展的密钥用例对应的复选框。
  3. 点击 Next
定义政策标识符

证书中的证书政策扩展程序表示颁发证书的 CA 池遵循的政策。此扩展程序可以包含以下方面的信息:在证书颁发之前如何验证身份、如何撤消证书,以及如何确保 CA 池的完整性。此扩展程序可帮助您验证 CA 池颁发的证书,并查看证书的使用方式。

如需了解详情,请参阅证书政策

如需指定用于定义证书使用情况的政策,请执行以下操作:

  1. 可选:在政策标识符字段中添加政策标识符。
  2. 点击 Next
添加授权信息访问 (AIA) OCSP 服务器

证书中的 AIA 扩展提供了以下信息:

  • OCSP 服务器的地址,您可以在其中查看证书的吊销状态。
  • 证书颁发者的访问方法。

如需了解详情,请参阅授权信息访问权限

如需添加显示在证书的 AIA 扩展字段中的 OCSP 服务器,请执行以下操作。以下过程是可选的。

  1. 可选:点击添加一项
  2. 服务器网址字段中,添加 OCSP 服务器的网址。
  3. 点击完成
  4. 点击 Next
配置其他扩展程序

如需配置其他自定义扩展以包含在 CA 池颁发的证书中,请执行以下操作。以下过程是可选的。

  1. 点击添加一项
  2. 对象标识符字段中,添加格式为英文句点分隔的数字的有效对象标识符。
  3. 字段中,添加标识符的 base64 编码值。
  4. 如果扩展程序至关重要,请选择扩展程序至关重要

要保存所有基准值配置,请点击完成

如需创建 CA 池,请点击完成

gcloud

运行以下命令:

gcloud privateca pools create POOL_NAME

POOL_NAME 替换为 CA 池的名称。

如果您没有指定 CA 池所需的层级,则系统会默认选择 Enterprise 层级。如果要为 CA 池指定层级,请运行以下 gcloud 命令:

gcloud privateca pools create POOL_NAME --tier=TIER_NAME

替换以下内容:

  • POOL_NAME:您的 CA 池的名称。
  • TIER_NAMEdevopsenterprise。如需了解详情,请参阅选择操作层级

如果您没有为 CA 池指定发布编码格式,系统会默认选择 PEM 发布编码格式。如果要为 CA 池指定发布编码格式,请运行以下 gcloud 命令:

gcloud privateca pools create POOL_NAME --publishing-encoding-format=PUBLISHING_ENCODING_FORMAT

替换以下内容:

  • POOL_NAME:您的 CA 池的名称。
  • PUBLISHING_ENCODING_FORMATPEMDER

如需详细了解 gcloud privateca pools create 命令,请参阅 gcloud privatecapool create

如需了解如何对 CA 池可以颁发的证书类型施加限制,请参阅向 CA 池添加证书颁发政策

Terraform

resource "google_privateca_ca_pool" "default" {
  name     = "ca-pool"
  location = "us-central1"
  tier     = "ENTERPRISE"
  publishing_options {
    publish_ca_cert = true
    publish_crl     = true
  }
  labels = {
    foo = "bar"
  }
}

Go

如需向 CA Service 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证

import (
	"context"
	"fmt"
	"io"

	privateca "cloud.google.com/go/security/privateca/apiv1"
	"cloud.google.com/go/security/privateca/apiv1/privatecapb"
)

// Create a Certificate Authority pool. All certificates created under this CA pool will
// follow the same issuance policy, IAM policies, etc.
func createCaPool(w io.Writer, projectId string, location string, caPoolId string) error {
	// projectId := "your_project_id"
	// location := "us-central1"	// For a list of locations, see: https://cloud.google.com/certificate-authority-service/docs/locations.
	// caPoolId := "ca-pool-id"		// A unique id/name for the ca pool.

	ctx := context.Background()
	caClient, err := privateca.NewCertificateAuthorityClient(ctx)
	if err != nil {
		return fmt.Errorf("NewCertificateAuthorityClient creation failed: %w", err)
	}
	defer caClient.Close()

	caPool := &privatecapb.CaPool{
		// Set the tier (see: https://cloud.google.com/certificate-authority-service/docs/tiers).
		Tier: privatecapb.CaPool_ENTERPRISE,
	}

	locationPath := fmt.Sprintf("projects/%s/locations/%s", projectId, location)

	// See https://pkg.go.dev/cloud.google.com/go/security/privateca/apiv1/privatecapb#CreateCaPoolRequest.
	req := &privatecapb.CreateCaPoolRequest{
		Parent:   locationPath,
		CaPoolId: caPoolId,
		CaPool:   caPool,
	}

	op, err := caClient.CreateCaPool(ctx, req)
	if err != nil {
		return fmt.Errorf("CreateCaPool failed: %w", err)
	}

	if _, err = op.Wait(ctx); err != nil {
		return fmt.Errorf("CreateCaPool failed during wait: %w", err)
	}

	fmt.Fprintf(w, "CA Pool created")

	return nil
}

Java

如需向 CA Service 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证


import com.google.api.core.ApiFuture;
import com.google.cloud.security.privateca.v1.CaPool;
import com.google.cloud.security.privateca.v1.CaPool.IssuancePolicy;
import com.google.cloud.security.privateca.v1.CaPool.Tier;
import com.google.cloud.security.privateca.v1.CertificateAuthorityServiceClient;
import com.google.cloud.security.privateca.v1.CertificateIdentityConstraints;
import com.google.cloud.security.privateca.v1.CreateCaPoolRequest;
import com.google.cloud.security.privateca.v1.LocationName;
import com.google.longrunning.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class CreateCaPool {

  public static void main(String[] args)
      throws InterruptedException, ExecutionException, IOException {
    // TODO(developer): Replace these variables before running the sample.
    // location: For a list of locations, see:
    // https://cloud.google.com/certificate-authority-service/docs/locations
    // poolId: Set a unique poolId for the CA pool.
    String project = "your-project-id";
    String location = "ca-location";
    String poolId = "ca-pool-id";
    createCaPool(project, location, poolId);
  }

  // Create a Certificate Authority Pool. All certificates created under this CA pool will
  // follow the same issuance policy, IAM policies,etc.,
  public static void createCaPool(String project, String location, String poolId)
      throws InterruptedException, ExecutionException, IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `certificateAuthorityServiceClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (CertificateAuthorityServiceClient certificateAuthorityServiceClient =
        CertificateAuthorityServiceClient.create()) {

      IssuancePolicy issuancePolicy = IssuancePolicy.newBuilder()
          .setIdentityConstraints(CertificateIdentityConstraints.newBuilder()
              .setAllowSubjectPassthrough(true)
              .setAllowSubjectAltNamesPassthrough(true)
              .build())
          .build();

      /* Create the pool request
        Set Parent which denotes the project id and location.
        Set the Tier (see: https://cloud.google.com/certificate-authority-service/docs/tiers).
      */
      CreateCaPoolRequest caPoolRequest =
          CreateCaPoolRequest.newBuilder()
              .setParent(LocationName.of(project, location).toString())
              .setCaPoolId(poolId)
              .setCaPool(
                  CaPool.newBuilder()
                      .setIssuancePolicy(issuancePolicy)
                      .setTier(Tier.ENTERPRISE)
                      .build())
              .build();

      // Create the CA pool.
      ApiFuture<Operation> futureCall =
          certificateAuthorityServiceClient.createCaPoolCallable().futureCall(caPoolRequest);
      Operation response = futureCall.get();

      if (response.hasError()) {
        System.out.println("Error while creating CA pool !" + response.getError());
        return;
      }

      System.out.println("CA pool created successfully: " + poolId);
    }
  }
}

Python

如需向 CA Service 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证

import google.cloud.security.privateca_v1 as privateca_v1

def create_ca_pool(project_id: str, location: str, ca_pool_name: str) -> None:
    """
    Create a Certificate Authority pool. All certificates created under this CA pool will
    follow the same issuance policy, IAM policies,etc.,

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        location: location you want to use. For a list of locations, see: https://cloud.google.com/certificate-authority-service/docs/locations.
        ca_pool_name: a unique name for the ca pool.
    """

    caServiceClient = privateca_v1.CertificateAuthorityServiceClient()

    ca_pool = privateca_v1.CaPool(
        # Set the tier (see: https://cloud.google.com/certificate-authority-service/docs/tiers).
        tier=privateca_v1.CaPool.Tier.ENTERPRISE,
    )
    location_path = caServiceClient.common_location_path(project_id, location)

    # Create the pool request.
    request = privateca_v1.CreateCaPoolRequest(
        parent=location_path,
        ca_pool_id=ca_pool_name,
        ca_pool=ca_pool,
    )

    # Create the CA pool.
    operation = caServiceClient.create_ca_pool(request=request)

    print("Operation result:", operation.result())

REST API

  1. 创建 CA 池。

    HTTP 方法和网址:

    POST https://privateca.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/caPools\?ca_pool_id=POOL_ID

    请求 JSON 正文:

    {
    "tier": "ENTERPRISE"
    }
    

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

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

    {
     "name": "projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID",
     "metadata": {...},
     "done": false
    }
    

  2. 轮询操作,直到完成为止。

    当长时间运行的操作的 done 属性设置为 true 时,表示操作已完成。

    HTTP 方法和网址:

    GET https://privateca.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID

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

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

    {
     "name": "projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID",
     "metadata": {...},
     "done": true,
     "response": {
       "@type": "type.googleapis.com/google.cloud.security.privateca.v1.CaPool",
       "name": "...",
       "tier": "ENTERPRISE"
     }
    }
    

为 CA 池添加或更新标签

标签是一种键值对,可帮助您整理 CA Service 资源。您可以根据标签对资源进行过滤。

如需为 CA 池添加或更新标签,请执行以下操作:

控制台

如需添加标签,请执行以下操作:

  1. 转到 Certificate Authority Service 页面。

    转到 Certificate Authority Service

  2. CA 池管理器标签页中,选择 CA 池。

  3. 点击标签

  4. 点击 添加标签

  5. 添加键值对。

  6. 点击保存

    向现有 CA 池添加标签。

如需修改现有标签,请执行以下操作:

  1. 转到 Certificate Authority Service 页面。

    转到 Certificate Authority Service

  2. CA 池管理器标签页中,选择 CA 池。

  3. 点击标签

  4. 修改标签的值。

  5. 点击保存

gcloud

运行以下命令:

gcloud privateca pools update POOL_ID --update-labels foo=bar

POOL_ID 替换为 CA 池的名称。

后续步骤