创建 CA 池

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

CA 池是由具有共同证书的多个 CA 组成的集合 颁发政策和 Identity and Access Management (IAM) 政策。CA 池 CA 轮替管理更轻松,可让您实现更高的总有效性 每秒查询次数 (QPS) 计费。

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

准备工作

确保您拥有 CA Service Operation Manager (roles/privateca.caManager) IAM 角色。有关 将 IAM 授予主账号,请参阅向单个主账号授予 角色

确定 CA 池的设置

本部分介绍 CA 池的设置并提供建议 以确定这些设置。

永久 CA 池设置

以下 CA 池设置一经创建便无法更改。

位置

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

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

层级

选择是创建具有 DevOps 模式还是 Enterprise 模式的 CA 池 层级。此选项会影响 CA Service 是否会保留创建的 创建的证书以后是否可以撤消,以及 从 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. 选择 Enterprise 或 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 证书发布到 Cloud Storage 则点击切换开关。
  2. 可选:要禁止将 CRL 发布到以下项目的 Cloud Storage 存储桶: CA 池中的 CA,请点击切换开关。
  3. 点击该菜单可选择已发布的 CA 证书和 CRL 的编码格式。

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

  4. 点击下一步

配置基准值

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

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

您可以使用此设置来配置 可以使用该证书密钥用法选项包括密钥 加密、数据加密、证书签名、CRL 签名等。

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

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

  1. 可选:在随即显示的窗口中,点击切换开关 您想要指定证书的基本密钥用途。
  2. 选中密钥的使用方式所对应的复选框。
  3. 选择您希望使用密钥的概要方式。
  4. 点击下一步
定义扩展密钥用法

您可以使用此设置 哪些项目可以使用。选项包括 客户端身份验证、代码签名、电子邮件保护 。

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

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

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

  1. 可选:要指定 CA 池问题,点击切换开关。
  2. 选中扩展密钥使用场景对应的复选框。
  3. 点击下一步
定义政策标识符

证书中的证书政策扩展表示政策 发出证书的 CA 池之后的任何配置。此附加信息中可以包含 也就是在证书颁发之前验证所有身份 以及如何确保 CA 池的完整性。此扩展程序可帮助您 验证 CA 池颁发的证书,并查看证书如何 。

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

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

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

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

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

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

若要添加显示在 请执行以下操作。以下步骤是可选的。

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

要配置其他自定义附加信息以添加到 使用 CA 池颁发的证书,请执行以下操作。流程如下 是可选属性。

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

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

配置扩展程序限制条件

要禁止将来自证书请求的所有扩展包含在 中,请执行以下操作: 已颁发的证书,请点击切换开关。

点击切换开关后,您会看到已知证书 extensions 字段,可用来选择证书扩展。接收者 选择证书扩展,请执行以下操作:

  1. 可选:点击已知的证书扩展字段,然后清除 。
  2. 可选:在自定义附加信息字段中,添加对象标识符 您想要包含在 CA 池的证书中的扩展 问题。
配置身份限制条件

要在证书中配置对正文和 SAN 的限制条件, CA 池问题,请执行以下操作:

  1. 可选:禁止传递证书请求中的主题 点击该切换开关
  2. 可选:要禁止在证书请求中使用主题备用名称,请执行以下操作: 点击切换开关即可。
  3. 可选:添加要放置的通用表达式语言 (CEL) 表达式 证书主题限制。如需了解详情,请参阅 使用 CEL
  4. 点击下一步

如需了解如何在证书颁发政策中配置其他参数, 请参阅 IssuancePolicy

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

gcloud

运行以下命令:

gcloud privateca pools create POOL_NAME

POOL_NAME 替换为 CA 池的名称。

如果您没有指定 CA 池所需的层级,则 Enterprise 层级。如果要为 Pod 指定层级 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 池添加证书颁发政策

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 服务进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

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 服务进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证


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 服务进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

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 池的名称。

后续步骤