인증서 템플릿을 사용하여 인증서 요청

이 페이지에서는 인증서 템플릿을 사용하여 인증서를 요청하는 방법을 설명합니다.

인증서 템플릿을 사용하면 인증서 발급에 세분화된 정책 제어를 구현할 수 있습니다. 예를 들어 인증서 템플릿을 사용하여 조직의 CA 풀에서 서버 TLS 인증서 발급을 표준화할 수 있습니다. 또는 인증서 템플릿을 사용하여 특정 사용자와 같이 보다 세부적인 수준에서 정책을 적용할 수 있습니다. 이는 여러 개인이 발급할 수 있는 인증서 종류를 제한해야 하는 경우에 유용합니다. 통상적인 발급 시나리오에 템플릿을 재사용할 수도 있습니다.

시작하기 전에

  1. CA Service를 위한 환경 준비

  2. 인증서 템플릿을 사용하여 인증서를 발급하는 데 필요한 권한을 얻으려면 관리자에게 인증서 템플릿에 대한 CA Service 인증서 템플릿 사용자(roles/privateca.templateUser) IAM 역할을 부여해 달라고 요청하세요.

    CA Service의 사전 정의된 IAM 역할에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.

    주 구성원에게 IAM 역할을 부여하는 방법에 대한 자세한 내용은 단일 역할 부여를 참조하세요.

인증서 발급 테스트

인증서 템플릿을 사용하여 서명된 인증서를 요청하기 전에 인증서 템플릿이 인증서를 성공적으로 생성할 수 있는지 확인하는 것이 좋습니다. CA 풀의 발급 정책과 인증서 템플릿의 정책 간에 충돌이 있으면 인증서 발급이 실패합니다. 발급을 테스트하면 이러한 충돌을 사전에 식별하고 해결할 수 있습니다. 테스트 인증서는 PEM으로 인코딩되지 않고 서명되지 않았으며 생성 요금이 부과되지 않습니다.

인증서 템플릿을 사용하여 인증서 발급을 테스트하려면 다음 단계를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 Certificate Authority Service 페이지로 이동합니다.

    Certificate Authority Service로 이동

  2. 템플릿 관리자 탭을 클릭합니다.

  3. 테스트할 인증서 템플릿을 클릭합니다. 템플릿 세부정보 페이지가 나타납니다.

  4. 테스트 요청을 만들려면 인증서 만들기를 클릭한 후 인증서 발급 테스트를 클릭합니다. 인증서 요청 양식이 나타납니다.

  5. 인증서 요청을 만드는 데 필요한 다음 세부정보를 지정합니다.

    • 리전: 인증서의 위치. CA 풀의 위치와 동일해야 합니다.
    • CA 풀: 인증서 발급을 담당하는 CA 풀
    • 인증서 템플릿: 인증서 발급에 사용할 템플릿
    • 도메인: SSL 또는 TLS 인증서로 보호하려는 사이트의 도메인 이름
  6. 인증서 생성을 클릭합니다.

  7. 인증서가 생성되면 보기를 클릭합니다. 테스트 또는 샘플 인증서는 동일한 페이지의 별도 패널에 표시됩니다.

  8. 충돌로 인해 인증서 발급이 실패하면 충돌을 해결하고 테스트 인증서 요청을 다시 제출합니다.

인증서 템플릿을 사용하여 인증서 발급

인증서 템플릿을 사용하여 서명된 인증서를 발급하려면 다음 단계를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 Certificate Authority Service 페이지로 이동합니다.

    Certificate Authority Service로 이동

  2. 템플릿 관리자 탭을 클릭합니다.

  3. 인증서 템플릿 페이지에서 사용할 인증서 템플릿을 클릭합니다. 템플릿 세부정보 페이지가 나타납니다.

  4. 인증서 만들기를 클릭합니다.

  5. 리전을 선택합니다. 이 리전은 사용하려는 CA 풀의 리전과 동일해야 합니다.

  6. CA 풀을 선택합니다.

  7. 인증서 서명 요청(CSR)을 사용하여 인증서를 생성하려면 CSR을 사용하여 인증서 요청을 참조하세요.

  8. 자동 생성 키를 사용하여 인증서를 생성하려면 자동 생성 키를 사용하여 인증서 요청을 참조하세요.

인증서 생성

  1. 인증서 생성을 클릭합니다. 인증서가 생성되면 메시지가 표시됩니다.
  2. 생성된 인증서를 보려면 인증서 보기를 클릭한 다음 보기를 클릭합니다.

선택사항: 서명된 인증서 다운로드

  1. PEM으로 인코딩된 인증서 체인을 다운로드하려면 인증서 체인 다운로드를 클릭합니다.
  2. 연결된 PEM으로 인코딩된 비공개 키를 다운로드하려면 비공개 키 다운로드를 클릭합니다.

gcloud

인증서 템플릿을 사용하여 인증서를 발급하려면 --template 플래그를 gcloud privateca certificates create 명령어에 다음 형식으로 추가합니다.

--template=projects/PROJECT_ID/locations/LOCATION/certificateTemplates/CERTIFICATE_TEMPLATE

CERTIFICATE_TEMPLATE을 이 인증서 발급에 사용할 인증서 템플릿의 이름으로 바꿉니다. 지정된 템플릿은 발급 CA 풀과 동일한 위치에 있어야 합니다. 자세한 내용은 테스트 DNS 인증서 생성프로덕션 인증서 생성에 제공된 샘플을 참조하세요.

Terraform

/**
 * Copyright 2022 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

resource "google_privateca_certificate_template" "template" {
  location    = "us-central1"
  name        = "my-certificate-template"
  description = "An updated sample certificate template"

  identity_constraints {
    allow_subject_alt_names_passthrough = true
    allow_subject_passthrough           = true

    cel_expression {
      description = "Always true"
      expression  = "true"
      location    = "any.file.anywhere"
      title       = "Sample expression"
    }
  }

  passthrough_extensions {
    additional_extensions {
      object_id_path = [1, 6]
    }

    known_extensions = ["EXTENDED_KEY_USAGE"]
  }

  predefined_values {
    additional_extensions {
      object_id {
        object_id_path = [1, 6]
      }

      value    = "c3RyaW5nCg=="
      critical = true
    }

    aia_ocsp_servers = ["string"]

    ca_options {
      is_ca                  = false
      max_issuer_path_length = 6
    }

    key_usage {
      base_key_usage {
        cert_sign          = false
        content_commitment = true
        crl_sign           = false
        data_encipherment  = true
        decipher_only      = true
        digital_signature  = true
        encipher_only      = true
        key_agreement      = true
        key_encipherment   = true
      }

      extended_key_usage {
        client_auth      = true
        code_signing     = true
        email_protection = true
        ocsp_signing     = true
        server_auth      = true
        time_stamping    = true
      }

      unknown_extended_key_usages {
        object_id_path = [1, 6]
      }
    }

    policy_ids {
      object_id_path = [1, 6]
    }
  }
}

resource "google_privateca_certificate_authority" "test_ca" {
  pool                     = "my-pool"
  certificate_authority_id = "my-certificate-authority-test-ca"
  location                 = "us-central1"
  deletion_protection      = false # set to true to prevent destruction of the resource
  config {
    subject_config {
      subject {
        organization = "HashiCorp"
        common_name  = "my-certificate-authority"
      }
      subject_alt_name {
        dns_names = ["hashicorp.com"]
      }
    }
    x509_config {
      ca_options {
        # is_ca *MUST* be true for certificate authorities
        is_ca = true
      }
      key_usage {
        base_key_usage {
          # cert_sign and crl_sign *MUST* be true for certificate authorities
          cert_sign = true
          crl_sign  = true
        }
        extended_key_usage {
          server_auth = false
        }
      }
    }
  }
  key_spec {
    algorithm = "RSA_PKCS1_4096_SHA256"
  }
}


resource "google_privateca_certificate" "default" {
  pool                  = "my-pool"
  location              = "us-central1"
  certificate_authority = google_privateca_certificate_authority.test_ca.certificate_authority_id
  lifetime              = "860s"
  name                  = "my-certificate-from-template"
  pem_csr               = tls_cert_request.example.cert_request_pem
  certificate_template  = google_privateca_certificate_template.template.id
}

resource "tls_private_key" "example" {
  algorithm = "RSA"
}

resource "tls_cert_request" "example" {
  private_key_pem = tls_private_key.example.private_key_pem

  subject {
    common_name  = "example.com"
    organization = "ACME Examples, Inc"
  }
}

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

동일한 매개변수를 사용하여 인증서를 요청할 수 있도록 조직의 다른 사용자와 인증서 요청 양식 링크를 공유하려면 다음 단계를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 CA 풀 관리자 탭으로 이동하여 요청 양식 링크 공유를 클릭합니다.
  2. 표시된 요청 양식 링크 공유 패널에서 요청을 만들도록 선택한 CA 풀과 인증서 템플릿을 선택합니다. 인증서 요청 링크가 표시됩니다.
  3. 필요에 따라 링크를 복사하여 공유합니다.

정책 충돌 해결

CA 풀의 발급 정책과 인증서 템플릿 간에 충돌이 있으면 인증서 요청이 잘못된 인수 오류와 함께 실패합니다. 예를 들어 CA 풀의 기준 값과 인증서 템플릿의 사전 정의된 값에 동일한 확장자(예: 기본 키 사용)가 정의된 경우가 해당됩니다. 또는 한 정책에 특정 확장자를 제외하는 확장자 제약조건이 있고 다른 정책이 기준 값에 해당 확장자의 값을 정의하는 경우에도 인증서 요청이 실패합니다.

정책 충돌을 보고 해결하려면 다음 단계를 따르세요.

콘솔

  1. 오류 메시지와 함께 표시되는 발급 정책 문제 해결 도구 링크를 클릭합니다. CA 풀의 발급 정책에 있는 기준 값 및 확장자 제약 조건을 인증서 템플릿의 정책에 있는 기준 값 및 확장자 제약 조건과 비교할 수 있는 문제 해결 도구 페이지가 표시됩니다. 정책 충돌이 강조 표시됩니다.
  2. CA 풀 또는 인증서 템플릿에 액세스하여 충돌하는 값을 업데이트하고 충돌을 해결합니다.
  3. 충돌이 해결된 후 인증서 요청을 다시 제출합니다.

템플릿을 사용하여 발급된 인증서 보기

인증서 템플릿을 사용하여 발급된 인증서를 보려면 다음 단계를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 템플릿 관리자 탭으로 이동합니다.
  2. 인증서 발급에 사용한 인증서 템플릿을 클릭합니다.
  3. 템플릿 세부정보 페이지에서 인증서를 클릭합니다. 선택한 인증서 템플릿을 사용하여 발급된 인증서 목록이 표시됩니다.

다음 단계