CA 풀 만들기

이 페이지에서는 인증 기관(CA) 풀을 만드는 방법을 설명합니다.

CA 풀은 공통 인증서 발급 정책과 Identity and Access Management(IAM) 정책이 적용되는 여러 CA의 모음입니다. CA 풀을 사용하면 CA 순환을 더 쉽게 관리하고 유효한 총 초당 쿼리 수(QPS)를 높일 수 있습니다.

Certificate Authority Service를 사용하여 CA를 만들려면 먼저 CA 풀을 만들어야 합니다. 자세한 내용은 CA 풀 개요를 참조하세요.

시작하기 전에

CA Service 작업 관리자(roles/privateca.caManager) IAM 역할이 있는지 확인합니다. 주 구성원에 IAM 부여에 대한 자세한 내용은 단일 역할 부여를 참조하세요.

CA 풀의 설정 결정

이 섹션에서는 CA 풀의 설정을 설명하고 설정 결정을 위한 추천을 제공합니다.

영구적인 CA 풀 설정

CA 풀을 만든 후에는 다음 CA 풀 설정을 변경할 수 없습니다.

위치

CA 풀의 위치를 지정합니다. CA 풀은 단일 Google Cloud 위치에 저장됩니다. CA 풀을 사용하려는 위치와 동일한 위치 또는 가까운 위치에 CA 풀을 만드는 것이 좋습니다.

지원되는 전체 위치 목록은 위치를 참조하세요.

등급

CA 풀을 DevOps 또는 Enterprise 등급으로 만들지 선택합니다. 이 선택은 CA Service가 생성된 인증서를 유지할지 여부, 생성된 인증서를 나중에 해지할 수 있는지 여부, CA 풀의 CA에서 인증서를 만들 수 있는 최대 속도에 영향을 줍니다. 자세한 내용은 작업 등급 선택을 참조하세요.

선택적 CA 풀 설정

인증서 발급 정책

CA 풀에 인증서 발급 정책이 있을 수 있습니다. 이 발급 정책은 CA 풀의 CA가 발급할 수 있는 인증서에 제한사항을 적용합니다. CA 풀을 만든 후 CA 풀의 발급 정책을 업데이트할 수 있습니다. 자세한 내용은 템플릿 및 발급 정책 개요를 참조하세요.

인증서 발급 정책을 구성하는 방법에 대한 자세한 내용은 CA 풀에 인증서 발급 정책 추가를 참조하세요.

게시 옵션

각 CA의 CA 인증서를 게시하도록 CA 풀을 구성할 수 있습니다. 인증서를 발급할 때 이 CA 인증서의 URL은 기관 정보 액세스(AIA) 확장자로 인증서에 포함됩니다.

Enterprise 등급 CA 풀의 CA는 연결된 Cloud Storage 버킷에 해지 인증서 목록(CRL)을 게시할 수 있습니다. 인증서를 발급할 때 이 CRL의 URL은 인증서에 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 풀에 포함된 CA의 Cloud Storage 버킷에 CA 인증서를 게시하지 못하도록 하려면 전환 버튼을 클릭합니다.
  2. 선택사항: CA 풀에 포함된 CA의 Cloud Storage 버킷에 CRL을 게시하지 못하도록 하려면 전환 버튼을 클릭합니다.
  3. 메뉴를 클릭하여 게시된 CA 인증서 및 CRL의 인코딩 형식을 선택합니다.

    CA 풀에 포함된 CA의 CA 인증서 및 CRL 게시 옵션 구성

  4. 다음을 클릭합니다.

ID 제약조건 구성

CA 풀이 발급하는 인증서에서 주체 및 SAN에 대한 제약조건을 구성하려면 다음을 수행합니다.

  1. 선택사항: 인증서 요청의 주체가 전달되지 않도록 하려면 전환 버튼을 클릭합니다.
  2. 선택사항: 인증서 요청의 주체 대체 이름이 전달되지 않도록 하려면 전환 버튼을 클릭합니다.
  3. 선택사항: 인증서 주체에 대한 제한사항을 설정하려면 Common Expression Language(CEL) 표현식을 추가합니다. 자세한 내용은 CEL 사용을 참조하세요.
  4. 다음을 클릭합니다.
확장자 제약조건 구성

인증서 요청의 모든 확장자가 발급된 인증서에 포함되지 않도록 하려면 전환 버튼을 클릭합니다.

전환 버튼을 클릭하면 인증서 확장자를 선택하는 데 사용할 수 있는 알려진 인증서 확장자 필드가 표시됩니다. 인증서 확장자를 선택하려면 다음 단계를 따르세요.

  1. 선택사항: 알려진 인증서 확장자 필드를 클릭하고 메뉴에서 불필요한 확장자를 삭제합니다.
  2. 선택사항: 커스텀 확장자 필드에서 CA 풀이 발급하는 인증서에 포함하려는 확장자의 객체 식별자를 추가합니다.
기준 값 구성

CA 풀에서 발급된 인증서에서 기준 값을 구성하려면 다음을 수행합니다.

  1. 전환 버튼을 클릭합니다.
  2. 기준 값 구성을 클릭합니다.
기본 키 사용 정의

이 설정을 사용해서 인증서에 포함된 키를 사용하는 방식을 구성할 수 있습니다. 키 사용 옵션에는 키 암호화, 데이터 암호화, 인증서 서명, CRL 서명 등이 포함됩니다.

자세한 내용은 키 사용을 참조하세요.

기본 키 사용을 정의하려면 다음을 수행합니다.

  1. 선택사항: 인증서의 기본 키 사용을 지정하려면 표시된 창에서 전환 버튼을 클릭합니다.
  2. 원하는 키 사용 방법에 해당하는 체크박스를 선택합니다.
  3. 원하는 대략적인 키 사용 방법을 선택합니다.
  4. 다음을 클릭합니다.
확장 키 사용 정의

이 설정을 사용해서 인증서에 포함된 키를 사용할 수 있는 보다 세부적인 시나리오를 선택할 수 있습니다. 옵션에는 서버 인증, 클라이언트 인증, 코드 서명, 이메일 보호 등이 포함됩니다.

확장 키 사용은 객체 식별자(OID)를 사용해서 정의됩니다. 확장 키 사용을 구성하지 않으면 모든 키 사용 시나리오가 허용됩니다.

자세한 내용은 확장 키 사용을 참조하세요.

확장 키 사용을 정의하려면 다음을 수행합니다.

  1. 선택사항: CA 풀이 발급하는 인증서에 확장 키 사용을 지정하려면 전환 버튼을 클릭합니다.
  2. 확장 키 사용 시나리오에 대한 체크박스를 선택합니다.
  3. 다음을 클릭합니다.
정책 식별자 정의

인증서의 인증서 정책 확장자에는 인증서 발급 CA 풀이 따르는 정책이 표시됩니다. 이러한 확장자에는 인증서 발급 전 ID 검증 방법, 인증서 해지 방법, CA 풀의 무결성 확인 방법에 대한 정보가 포함될 수 있습니다. 이 확장자를 사용하면 CA 풀에서 발급되는 인증서를 확인하고 인증서 사용 방법을 볼 수 있습니다.

자세한 내용은 인증서 정책을 참조하세요.

인증서 사용을 정의하는 정책을 지정하려면 다음을 수행합니다.

  1. 선택사항: 정책 식별자 필드에 정책 식별자를 추가합니다.
  2. 다음을 클릭합니다.
기관 정보 액세스(AIA) OCSP 서버 추가

인증서의 AIA 확장자는 다음 정보를 제공합니다.

  • 인증서의 해지 상태를 확인할 수 있는 OCSP 서버 주소
  • 인증서 발급기관의 액세스 방법

자세한 내용은 기관 정보 액세스를 참조하세요.

인증서의 AIA 확장자 필드에 표시되는 OCSP 서버를 추가하려면 다음을 수행합니다. 다음 절차는 선택사항입니다.

  1. 선택사항: 항목 추가를 클릭합니다.
  2. 서버 URL 필드에 OCSP 서버의 URL을 추가합니다.
  3. 완료를 클릭합니다.
  4. 다음을 클릭합니다.
추가 확장자 구성

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_NAME: devops 또는 enterprise입니다. 자세한 내용은 작업 등급 선택을 참조하세요.

CA 풀에 게시 인코딩 형식을 지정하지 않으면 PEM 게시 인코딩 형식이 기본적으로 선택됩니다. CA 풀의 게시 인코딩 형식을 지정하려면 다음 gcloud 명령어를 실행합니다.

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

다음을 바꿉니다.

  • POOL_NAME: CA 풀의 이름입니다.
  • PUBLISHING_ENCODING_FORMAT: PEM 또는 DER

gcloud privateca pools create 명령어에 대한 자세한 내용은 gcloud privateca pools 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 메서드 및 URL:

    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 메서드 및 URL:

    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 풀의 이름으로 바꿉니다.

다음 단계